Python3如何在对象中定义mro?
问题描述:
更新------------------Python3如何在对象中定义mro?
object
是type
一个实例,但在同一时间,object
也是基类的type
。而type
是object
的一个实例。我对此很困惑。这完全不合逻辑。为什么Python做到这一点?
>>> isinstance(object,type)
True
>>> isinstance(type,object)
True
>>> type.__bases__
(<class 'object'>,)
原始--------------------------------
我知道type
有mro
。但我不明白为什么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
答
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'>]
由于类属性总是可以从一个实例访问。 –
@Ignacio Vazquez-Abrams谢谢,但仍然令人困惑 – tcpiper
@ IgnacioVazquez-Abrams这不是整个故事,'type.mro!= object.mro'。 – augurar