"mro()"有什么作用?

zjm*_*126 118 python method-resolution-order

django.utils.functional.py:

for t in type(res).mro():  # <----- this
    if t in self.__dispatch:
        return self.__dispatch[t][funcname](res, *args, **kw)
Run Code Online (Sandbox Code Playgroud)

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

Ale*_*lli 196

跟着...:

>>> 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'>)
>>> 
Run Code Online (Sandbox Code Playgroud)

只要我们有单继承,__mro__就是它的元组:类,它的基数,它的基数等等object(当然只适用于新式类).

现在,有多重继承......:

>>> class D(B, C): pass
... 
>>> D.__mro__
(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <type 'object'>)
Run Code Online (Sandbox Code Playgroud)

...你也得到保证__mro__,没有类重复,并且没有类在其祖先之后,除了首先进入多重继承的同一级别的类(如本例中的B和C)之外__mro__左到右.

你在类的实例上获得的每个属性,而不仅仅是方法,都是沿着概念查找的__mro__,所以,如果祖先中有多个类定义了这个名称,这就告诉你将找到属性的位置 - 在第一个类中在__mro__定义该名称.

  • `mro`可以由元类定制,在类初始化时调用一次,结果存储在`__mro__`中 - 参见http://docs.python.org/library/stdtypes.html?highlight=mro#class .__ mro__. (24认同)
  • 为什么它被称为**方法解析顺序**而不是**属性解析顺序**? (18认同)
  • 嗨,亚历克斯,D .__ mro__和D.mro()之间有什么区别. (8认同)

Ned*_*der 80

mro()代表方法解决顺序.它按照搜索方法的顺序返回类派生类型的列表.

mro()__mro__仅适用于新样式类.在python 3中,它们没有任何问题.但是在python 2中,这些类需要从对象继承.


Str*_*ker 9

这可能会显示解决的顺序.

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())
Run Code Online (Sandbox Code Playgroud)

并且会有回应

I am from A class
[<class '__main__.D'>, <class '__main__.B'>, <class '__main__.A'>, <class '__main__.C'>, <class 'object'>]
Run Code Online (Sandbox Code Playgroud)

该规则是深度优先的,在这种情况下意味着D,B,A,C.

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

  • “Python 从 mro 中删除了对该类的第一次提及”是什么意思? (2认同)
  • @RuthvikVaila:我认为这部分表述不清。在这篇关于 Python 历史的 [博客文章](http://python-history.blogspot.com/2010/06/method-resolution-order.html) 中,Guido van Rossum 评论了(关于 Python 2.2 中引入的 MRO 方案) )“如果在此搜索中任何类重复,除了 **last** 出现的所有类都将从 MRO 列表中删除”(强调我的)。这意味着它可以删除的不仅仅是类的第一个“提及”。 (2认同)