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()。这是什么做的,什么是“维修”呢?

有帮助吗?

解决方案

沿着跟随...

>>> 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__第一类

其他提示

mro()表示法解析顺序。它返回的类是从派生类型的列表,在它们中搜索方法的顺序。

<强> MRO()或<强> __ MRO __ 只对新式类。在Python 3,他们没有任何问题的工作。但在Python 2这些类需要从对象继承。

这或许会显示分辨率的顺序。

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通常使用的深度优先顺序搜索继承的类时,但是当两个类从同一类继承,Python中去除MRO该类的第一次提到。

分辨率顺序将在菱形继承不同。

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


class B1(A):
    def dothis(self):
        print('I am from B1 class')
    # pass


class B2(object):
    def dothis(self):
        print('I am from B2 class')
    # pass


class B3(A):
    def dothis(self):
        print('I am from B3 class')


# Diamond inheritance
class D1(B1, B3):
    pass


class D2(B1, B2):
    pass


d1_instance = D1()
d1_instance.dothis()
# I am from B1 class
print(D1.__mro__)
# (<class '__main__.D1'>, <class '__main__.B1'>, <class '__main__.B3'>, <class '__main__.A'>, <class 'object'>)


d2_instance = D2()
d2_instance.dothis()
# I am from B1 class
print(D2.__mro__)
# (<class '__main__.D2'>, <class '__main__.B1'>, <class '__main__.A'>, <class '__main__.B2'>, <class 'object'>)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top