有什么mro()做?


示例来自django.utils.functional

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

答案

跟着…:

>>> 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(当然仅适用于新式课程)。

现在,与多种的遗产…:

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

…您也得到保证,__mro__,没有重复的课程,也没有类别的祖先之后,除以首先在相同级别的多个继承级别输入的类(例如本示例中的B和C)__mro__左到右。

从概念上看__mro__,因此,如果祖先中有多个班级定义了该名称,则告诉您在哪里找到属性 - 在第一类中__mro__这定义了该名称。

来自: stackoverflow.com