“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中删除该类的第一个提到。