更新------------------
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
答案 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'>]