2017-02-22 115 views
6

Python具有內置函數type,每個實例也具有__class__屬性。我一般認爲他們回來了同樣的事情。即使兩者的文件聽起來相似:什麼時候是類型(實例)而不是實例.__ class__?

instance.__class__

的類,其中一類實例所屬。

type(object)

帶一個參數,返回對象的類型。

然而在abc.ABCMeta.__instancecheck__有一個檢查它們是否相同(略微縮短):

subclass = instance.__class__ 
subtype = type(instance) 
if subtype is subclass: 

當將不是這種情況?什麼時候是type(instance)instance.__class__不一樣?

+0

可能的重複http://stackoverflow.com/questions/9610993/python-type-or-class-or-is – Kasramvd

+0

@Kasramvd感謝您的鏈接,我相信它可能是http:// stackoverflow的重複。 COM /問題/ 1060499 /差間typeobj-和對象類。我不確定爲什麼他們在提問時沒有出現,在提出問題時也沒有出現在「提出的重複內容」中。 – MSeifert

+0

是的,有時候會發生這種情況;) – Kasramvd

回答

2

這是舊樣式對象(從無從繼承)的情況。這些對象不具有__class__屬性。我認爲他們這樣做是爲了防止錯誤。用於Python 2.7實施例:

class A: 
    pass 

class B(object): 
    pass 

a = A() 
b = B() 

print(dir(a)) # ['__doc__', '__module__'] 
print(dir(b)) # ['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__'] 

print(b.__class__) # <class '__main__.B'> 
print(type(b))  # <class '__main__.B'> 

##################### 
# The intersting part 
print(a.__class__) # __main__.A 
print(type(a))  # <type 'instance'> 


print(B.__class__) # <type 'type'> 
print(type(B))  # <type 'type'> 

print(type(A))  # <type 'classobj'> 
#print(A.__class__) # AttributeError: class A has no attribute '__class__' 

進一步信息請參閱本:

注:從CPython的給定的行被改變在2008上一次(commit),所以它似乎確實是一個兼容性的東西,或者他們只是忘了它。

+0

雖然這是有道理的 - 我正在考慮(忘記提及,明確地)關於Python 3.x,並且沒有舊風格的類了。 – MSeifert

+0

@MSeifert上一次在2008年更改了cpython的給定行(https://github.com/python/cpython/commit/68f5fbe94488b671ee6dfae74d918cc6a8eeca56),所以它似乎是兼容性的東西,或者他們只是忘記了它。 – ppasler

+0

@MSeifert我已經更新了我的答案。 – ppasler

相關問題