回答:
従う...:
>>> 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__
その名前を定義しています。
これはおそらく解決の順序を示します。
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'>)
class B3
、2番目の場合はclass A
後で行くのか理解できませんclass B1