답변:
을 따라서...:
>>> 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은 일반적으로 상속 클래스를 검색 할 때 깊이 우선 순서를 사용 하지만 두 클래스가 동일한 클래스에서 상속 될 때 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
하지만 두 번째 경우에는 class A
이후 로 이동합니다class B1