簡體   English   中英

為什么python中的對象是'instance'類型?

[英]Why an object in python is of type 'instance'?

我有以下代碼:

>>> class MyClass:
    pass

>>> myObj=MyClass()

>>> type(myObj)
<type 'instance'>     <==== Why it is not type MyClass ?

>>> type(MyClass)
<type 'classobj'>  <=== Why it is not just 'MyClass'?

>>> isinstance(myObj, instance)  <==== Why the 'instance' is not defined?

Traceback (most recent call last):
  File "<pyshell#91>", line 1, in <module>
    isinstance(myObj, instance)
NameError: name 'instance' is not defined

>>> isinstance(myObj, MyClass)
True

>>> myObj.__class__
<class __main__.MyClass at 0x0000000002A44D68> <=== Why different from type(myObj) ?

似乎Python在類和它的實例類型之間有一些額外的間接

我習慣了C#。 在C#中, typeof(MyClass)將返回MyClass

加1

以下是2.7.6和3.4.1之間的一些比較。

我想知道如何在Python中實現==運算符。

在此輸入圖像描述

這是因為你使用的是舊式的課程 而不是做:

class MyClass:
    pass

你需要這樣做:

class MyClass(object):
    pass

...為了使用新式的課程。 現在,如果你type(myObj) ,你會按預期返回<class '__main__.MyClass'>

事實上,Python引入新式類的主要原因之一正是由於您觀察到的問題:

Python 2.2中引入了新式類來統一類和類型。 新式類既不是用戶定義的類型,也不是用戶定義的類型。 如果x是新樣式類的實例,則type(x)通常與x.__class__相同(雖然這不能保證 - 允許新樣式類實例覆蓋為x.__class__返回的值) 。

引入新式類的主要動機是提供具有完整元模型的統一對象模型。 它還具有許多實際的好處,例如能夠對大多數內置類型進行子類化,或者引入“描述符”,它們可以啟用計算屬性。

來源

這有點像kludge,不得不擴展object ,但幸運的是在Python 3中,舊式類被完全刪除,因此使用任一種形式聲明類都做同樣的事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM