2016-04-29 51 views
1

更新------------------Python3如何在對象中定義mro?

objecttype一個實例,但在同一時間,object也是基類的type。而typeobject的一個實例。我對此很困惑。這完全不合邏輯。爲什麼Python做到這一點?

>>> isinstance(object,type) 
True 
>>> isinstance(type,object) 
True 
>>> type.__bases__ 
(<class 'object'>,) 

原始--------------------------------

我知道typemro。但我不明白爲什麼mro可以從object調用。 python如何實現這個?

>>> object.mro() 
[<class 'object'>] 
>>> 'mro' in dir(object) 
False 
>>> 'mro' in object.__dict__ 
False 
>>> 'mro' in dir(type) 
True 
>>> 'mro' in type.__dict__ 
True 
>>> issubclass(type,object) 
True 
+0

由於類屬性總是可以從一個實例訪問。 –

+0

@Ignacio Vazquez-Abrams謝謝,但仍然令人困惑 – tcpiper

+1

@ IgnacioVazquez-Abrams這不是整個故事,'type.mro!= object.mro'。 – augurar

回答

1

Descriptors參與其中。

解析object.mro時,解釋器首先在object.__dict__中查找'mro'

>>> object.__dict__['mro'] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
KeyError: 'mro' 

由於'mro'object.__dict__,解釋看起來type(object).__dict__

>>> type(object).__dict__['mro'] 
<method 'mro' of 'type' objects> 

此對象是描述符,因爲它有一個__get__方法。所以解釋器調用__get__方法來獲得object.mro的實際值。

基於你可能會想,既然object是一類將調用__get__(None, object)的文檔,但在這種情況下object被視爲type類的一個實例,以便解釋稱__get__(object, type(object))得到的結果。

>>> type(object).__dict__['mro'].__get__(object, type(object)) 
<built-in method mro of type object at 0x1047d2ae0> 

要確認的結果是什麼,我們正在尋找:

>>> type(object).__dict__['mro'].__get__(object, type(object)) == object.mro 
True 
>>> type(object).__dict__['mro'].__get__(object, type(object))() 
[<class 'object'>] 
相關問題