更新
object是type的一个实例,但同时,object也是type的基类。type是object的一个实例。我真的很困惑。这完全不合逻辑。为什么蟒蛇要这么做?
>>> 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发布于 2016-04-29 09:13:47
描述符也参与其中。
解析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'>]https://stackoverflow.com/questions/36933564
复制相似问题