Python3如何在对象中定义mro?

时间:2016-04-29 08:39:30

标签: python python-3.x

更新------------------

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

1 个答案:

答案 0 :(得分:1)

Descriptors参与其中。

解析object.mro时,解释程序会首先在'mro'中查找object.__dict__

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