質問

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() は使用するためだけのものですこのリストを返します種類のクラスから派生するために彼を検索す。

分析() または __析__ 作品のみで新しいスタイル。Python3に、それらの作品はあります。がpython2クラスの必要からは継承します。

これはおそらく、解像度の順序を示すだろう。

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から、そのクラスの最初の言及を削除します。

解像度の注文がダイヤモンドの継承では異なるであろう。

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