首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >"mro()“做什么?

"mro()“做什么?
EN

Stack Overflow用户
提问于 2010-01-06 11:04:17
回答 4查看 69.2K关注 0票数 147

django.utils.functional.py

代码语言:javascript
复制
for t in type(res).mro():  # <----- this
    if t in self.__dispatch:
        return self.__dispatch[t][funcname](res, *args, **kw)

我不明白mro()。它是做什么的,"mro“是什么意思?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-01-06 11:17:19

跟随……:

代码语言:javascript
复制
>>> class A(object): pass
... 
>>> A.__mro__
(<class '__main__.A'>, <type 'object'>)
>>> class B(A): pass
... 
>>> B.__mro__
(<class '__main__.B'>, <class '__main__.A'>, <type 'object'>)
>>> class C(A): pass
... 
>>> C.__mro__
(<class '__main__.C'>, <class '__main__.A'>, <type 'object'>)
>>> 

只要我们有单一继承,__mro__就只是一个元组:类、它的基类、它的基类的基类,以此类推,直到object (当然,只适用于新样式的类)。

现在,使用多重继承...:

代码语言:javascript
复制
>>> class D(B, C): pass
... 
>>> D.__mro__
(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <type 'object'>)

...you还得到了这样的保证:在__mro__中,没有重复的类,也没有类在它的祖先之后,除了第一次进入相同级别的多重继承的类(如本例中的B和C)从左到右在__mro__中。

您在类实例上获得的每个属性,而不仅仅是方法,在概念上都是沿着__mro__进行查找的,因此,如果祖先中有多个类定义了该名称,这将告诉您在何处可以找到该属性--在定义该名称的__mro__的第一个类中。

票数 234
EN

Stack Overflow用户

发布于 2010-01-06 11:08:58

mro()代表方法解析顺序。它返回派生类的类型列表,按照在方法中搜索类型的顺序。

mro()__mro__只适用于新的样式类。在Python3中,它们工作起来没有任何问题。然而,在Python2中,这些类需要从object继承。

票数 89
EN

Stack Overflow用户

发布于 2016-03-22 05:47:42

这可能会显示解决方案的顺序。

代码语言:javascript
复制
class A(object):
    def dothis(self):
        print('I am from A class')

class B(A):
    pass

class C(object):
    def dothis(self):
        print('I am from C class')

class D(B, C):
    pass

d_instance= D()
d_instance.dothis()
print(D.mro())

回应会是

代码语言:javascript
复制
I am from A class
[<class '__main__.D'>, <class '__main__.B'>, <class '__main__.A'>, <class '__main__.C'>, <class 'object'>]

规则是深度优先的,在本例中意味着D、B、A、C。

在搜索继承类时,Python通常使用深度优先的顺序,但是当两个类继承自同一个类时,Python会从mro中删除第一次提到该类。

票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2010692

复制
相关文章

相似问题

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