首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python3如何在对象中定义mro?

Python3如何在对象中定义mro?
EN

Stack Overflow用户
提问于 2016-04-29 08:39:29
回答 1查看 498关注 0票数 1

更新

objecttype的一个实例,但同时,object也是type的基类。typeobject的一个实例。我真的很困惑。这完全不合逻辑。为什么蟒蛇要这么做?

代码语言:javascript
复制
>>> isinstance(object,type)
True
>>> isinstance(type,object)
True
>>> type.__bases__
(<class 'object'>,)

原作

我知道typemro。但我不明白为什么mro可以从object中调用。python是如何实现这个的?

代码语言:javascript
复制
>>> 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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-29 09:13:47

描述符也参与其中。

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

代码语言:javascript
复制
>>> object.__dict__['mro']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'mro'

由于'mro'不在object.__dict__中,所以解释器在type(object).__dict__中查找。

代码语言:javascript
复制
>>> type(object).__dict__['mro']
<method 'mro' of 'type' objects>

这个对象是一个描述符,因为它有一个__get__方法。因此,解释器调用__get__方法来获得object.mro的实际值。

根据文档,您可能会认为,由于object是一个类,它将调用__get__(None, object),但在本例中,object被视为类type的一个实例,因此解释器调用__get__(object, type(object))来获得结果。

代码语言:javascript
复制
>>> type(object).__dict__['mro'].__get__(object, type(object))
<built-in method mro of type object at 0x1047d2ae0>

为了确认结果是我们要找的:

代码语言:javascript
复制
>>> type(object).__dict__['mro'].__get__(object, type(object)) == object.mro
True
>>> type(object).__dict__['mro'].__get__(object, type(object))()
[<class 'object'>]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36933564

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档