153

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」はどういう意味ですか?

4

4 に答える 4

243

フォローしてください...:

>>> 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__名前を定義する。

于 2010-01-06T03:17:19.010 に答える
92

mro()MethodResolutionOrderの略です。メソッドが検索された順序で、クラスが派生したタイプのリストを返します。

mro()__mro__新しいスタイルのクラスでのみ機能します。Python 3では、問題なく動作します。ただし、Python 2では、これらのクラスはから継承する必要がありobjectます。

于 2010-01-06T03:08:58.440 に答える
16

これはおそらく解決の順序を示しています。

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は通常、継承クラスを検索するときに深さ優先を使用しますが、2つのクラスが同じクラスから継承する場合、Pythonはそのクラスの最初の言及をmroから削除します。

于 2016-03-21T21:47:41.840 に答える
3

ダイヤモンドの継承では、解決の順序が異なります。

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'>)
于 2018-08-05T13:13:24.767 に答える