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

只要我们具有单一继承,__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__定义该名称。