Python3如何在对象中定义mro?

问题描述:

更新------------------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

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'>]