자세한 내용은 Guido 자신의 블로그 게시물 Method Resolution Order (이전에 시도한 두 가지 시도 포함) 에서 합리적으로 자세히 설명되어 있습니다.
귀하의 예에서는 Third()
을 호출 First.__init__
합니다. 파이썬은 왼쪽에서 오른쪽으로 나열된 클래스의 부모에서 각 속성을 찾습니다. 이 경우 찾고 있습니다 __init__
. 따라서 정의하면
class Third(First, Second):
...
파이썬은보고 시작 First
하면, 그리고 First
속성이없는, 그때는 볼 것이다 Second
.
상속이 경로를 넘을 때 (예 : First
에서 상속 된 경우 Second
) 이 상황이 더 복잡해집니다 . 자세한 내용은 위의 링크를 읽으십시오. 그러나 간단히 말해서 Python은 자식 클래스 자체부터 시작하여 상속 목록에 각 클래스가 나타나는 순서를 유지하려고 시도합니다.
예를 들어 다음과 같은 경우
class First(object):
def __init__(self):
print "first"
class Second(First):
def __init__(self):
print "second"
class Third(First):
def __init__(self):
print "third"
class Fourth(Second, Third):
def __init__(self):
super(Fourth, self).__init__()
print "that's it"
MRO는 [Fourth, Second, Third, First].
그런데 파이썬이 일관된 메소드 해결 순서를 찾지 못하면 사용자를 놀라게 할 수있는 동작으로 돌아 가지 않고 예외가 발생합니다.
모호한 MRO의 예를 추가하도록 편집되었습니다.
class First(object):
def __init__(self):
print "first"
class Second(First):
def __init__(self):
print "second"
class Third(First, Second):
def __init__(self):
print "third"
한다 Third
의 MRO는 수 [First, Second]
또는 [Second, First]
? 명백한 기대는 없으며 Python은 오류를 발생시킵니다.
TypeError: Error when calling the metaclass bases
Cannot create a consistent method resolution order (MRO) for bases Second, First
편집 : 위의 예제에는 super()
호출이 부족하다고 주장하는 사람들이 여러 명 있습니다. 예제 의 요점은 MRO 구성 방법을 보여주는 것입니다. 그들은되어 있지 "처음 \ nsecond \ 셋째"또는 무엇이든을 인쇄하기위한 것. 물론 예제를 가지고 놀거나, super()
호출을 추가 하고, 어떤 일이 발생하는지 확인하고, 파이썬의 상속 모델에 대해 더 깊이 이해할 수 있습니다. 그러나 여기서의 목표는 간단하게 유지하고 MRO가 어떻게 구축되는지 보여주는 것입니다. 그리고 내가 설명한대로 작성되었습니다.
>>> Fourth.__mro__
(<class '__main__.Fourth'>,
<class '__main__.Second'>, <class '__main__.Third'>,
<class '__main__.First'>,
<type 'object'>)
super()
입니다. 쓸모없는 오버 헤드 인 선형 상속을 사용하는 클래스와 함께 사용하지 않는 것이 좋습니다.