“mro()”是做什么的?

django.utils.functional.py

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

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

跟着…:

 >>> 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'>) >>> 

只要我们有单一的inheritance, __mro__只是它的元组:它的类,它的基,它的基础,等等,直到object (当然只适用于新风格的类)。

现在, 多重inheritance…:

 >>> class D(B, C): pass ... >>> D.__mro__ (<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <type 'object'>) 

…你也可以得到保证,在__mro__ ,没有类是重复的,在其祖先之后没有类,除了首先在同一级别的多重inheritance上input的类(如本例中的B和C) __mro__从左到右。

你在类的实例上获得的每一个属性,不仅仅是方法,在概念上是沿着__mro__ ,所以,如果祖先中的不止一个类定义了这个名字,这就告诉你在哪里可以find属性 – 在第一类在定义该名称的__mro__中。

mro()代表方法parsing顺序。 它按照它们search方法的顺序返回类的派生types列表。

mro()__mro__只适用于新的风格类。 在python 3中,它们没有任何问题。 但在Python 2中,这些类需要从对象inheritance。

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

 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()) 

和回应将是

 I am from A class [<class '__main__.D'>, <class '__main__.B'>, <class '__main__.A'>, <class '__main__.C'>, <class 'object'>] 

规则首先是部分,在这种情况下意味着D,B,A,C

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