2012-03-14 49 views

回答

18

在Python 2,是不一樣的東西,具體而言,對於老式類,type(obj)is not the same objectobj.__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?

+0

+1:這是一個非常明確的描述,也是一個很好的觀點。謝謝! – EOL 2012-03-14 12:26:20

+0

對於任何人想知道的,'isinstance'是[special-cased](https://github.com/python/cpython/blob/e6a0b5982973e64b9f​​a28e5e3e54eb8c47882780/Objects/abstract.c#L2898)舊式實例和類(例如'PyClass_Check (cls)&& PyInstance_Check(inst)'在C中)。由於沒有基於類型的關係,因此它會爲'issubclass'檢查獲取實例的__class__',這也是[特殊的](https://github.com/python/cpython/blob/e6a0b5982973e64b9f​​a28e5e3e54eb8c47882780/Objects /classobject.c#L486)用於舊式類。 – eryksun 2017-06-15 13:04:45

6

一切都是對象:

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的一個實例。

+0

您有參考嗎? – EOL 2012-03-14 12:22:55

+1

@EOL:[this one](http://www.cafepy.com/article/python_types_and_objects/python_types_and_objects.html)相當有幫助 – georg 2012-03-14 12:32:26

+1

謝謝。我查看了參考資料,但是我找不到任何關於Python中的所有內容都是* type *'object'這一觀點的任何跡象(Python中的「一切都是對象」這一事實並不意味着同樣的事實)。 – EOL 2012-03-14 13:48:54

1

當進行表達式

old_style = OldStyle() 

這意味着你正在實例化對象,其中old_style是類舊式的一個實例。

此外,Python 3.2中都評估爲True。

相關問題