在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“是什么意思?
发布于 2010-01-06 11:17:19
跟随……:
>>> 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'>)...you还得到了这样的保证:在__mro__中,没有重复的类,也没有类在它的祖先之后,除了第一次进入相同级别的多重继承的类(如本例中的B和C)从左到右在__mro__中。
您在类实例上获得的每个属性,而不仅仅是方法,在概念上都是沿着__mro__进行查找的,因此,如果祖先中有多个类定义了该名称,这将告诉您在何处可以找到该属性--在定义该名称的__mro__的第一个类中。
发布于 2010-01-06 11:08:58
mro()代表方法解析顺序。它返回派生类的类型列表,按照在方法中搜索类型的顺序。
mro()和__mro__只适用于新的样式类。在Python3中,它们工作起来没有任何问题。然而,在Python2中,这些类需要从object继承。
发布于 2016-03-22 05:47:42
这可能会显示解决方案的顺序。
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中删除第一次提到该类。
https://stackoverflow.com/questions/2010692
复制相似问题