怎麼可能有一個類的實例是object
,沒有類是object
的子類?這裏有一個例子:實例是一個「對象」,但類不是「對象」的子類:這怎麼可能?
>>> class OldStyle(): pass
>>> issubclass(OldStyle, object)
False
>>> old_style = OldStyle()
>>> isinstance(old_style, object)
True
怎麼可能有一個類的實例是object
,沒有類是object
的子類?這裏有一個例子:實例是一個「對象」,但類不是「對象」的子類:這怎麼可能?
>>> class OldStyle(): pass
>>> issubclass(OldStyle, object)
False
>>> old_style = OldStyle()
>>> isinstance(old_style, object)
True
在Python 2,型和類是不一樣的東西,具體而言,對於老式類,type(obj)
is not the same object爲obj.__class__
。所以這是可能的,因爲舊式的類的實例是不同類型(instance
)比他們班的實際上是:
>>> class A(): pass
>>> class B(A): pass
>>> b = B()
>>> assert b.__class__ is B
>>> issubclass(b.__class__, A) # same as issubclass(B, A)
True
>>> issubclass(type(b), A)
False
>>> type(b)
<type 'instance'>
>>> b.__class__
<class __main__.B at 0x10043aa10>
這新式的類解析:
>>> class NA(object): pass
>>> class NB(NA): pass
>>> nb = NB()
>>> issubclass(type(nb), NA)
True
>>> type(nb)
<class '__main__.NB'>
>>> nb.__class__
<class '__main__.NB'>
舊式班級不是一種類型,新式班級是:
>>> isinstance(A, type)
False
>>> isinstance(NA, type)
True
老風格類被聲明爲棄用。在Python 3中,只有新風格的類; class A()
相當於class A(object)
,您的代碼將在兩次檢查中產生True
。
看看這個問題的更多討論:What is the difference between old style and new style classes in Python?
一切都是對象:
isinstance(123, object) # True
isinstance("green cheese", object) # True
isinstance(someOldClassObject, object) # True
isinstance(someNewClassObject, object) # True
isinstance(object, object) # True
isinstance(None, object) # True
注意,這個問題具有本質無關OLD-與新樣式類。 isinstance(old_style, object)
是True
僅僅是一個事實的推論,即python中的每個值都是object
的一個實例。
當進行表達式
old_style = OldStyle()
這意味着你正在實例化對象,其中old_style是類舊式的一個實例。
此外,Python 3.2中都評估爲True。
+1:這是一個非常明確的描述,也是一個很好的觀點。謝謝! – EOL 2012-03-14 12:26:20
對於任何人想知道的,'isinstance'是[special-cased](https://github.com/python/cpython/blob/e6a0b5982973e64b9fa28e5e3e54eb8c47882780/Objects/abstract.c#L2898)舊式實例和類(例如'PyClass_Check (cls)&& PyInstance_Check(inst)'在C中)。由於沒有基於類型的關係,因此它會爲'issubclass'檢查獲取實例的__class__',這也是[特殊的](https://github.com/python/cpython/blob/e6a0b5982973e64b9fa28e5e3e54eb8c47882780/Objects /classobject.c#L486)用於舊式類。 – eryksun 2017-06-15 13:04:45