소개
다중 상속은 어느 부모를 결정할 때 고유한 과제를 제시합니다. super() 함수를 사용하여 호출하는 메서드입니다. 이 문서에서는 MRO(Method Resolution Order)와의 상호 작용에 중점을 두고 이러한 시나리오에서 super()의 동작을 살펴봅니다.
Super() 및 상위 메서드 호출
다중 상속과 함께 super()를 사용하는 경우 MRO의 첫 번째 부모 클래스의 메서드를 참조합니다. 예를 들어 아래 코드 조각에서
class First(object): def __init__(self): print("first") class Second(object): def __init__(self): print("second") class Third(First, Second): def __init__(self): super(Third, self).__init__() print("that's it")
세 번째에 대한 MRO는 [세 번째, 첫 번째, 두 번째, 개체]입니다. 따라서 Third의 super().__init__()는 First.__init__을 참조합니다.
MRO(메서드 해결 순서)
MRO는 Python 검색 순서를 결정합니다. 상위 클래스에서 상속된 메서드 및 속성의 경우. 일반적으로 MRO는 하위 클래스를 먼저 나열한 다음 클래스 정의에 나열되어 있는 상위 클래스를 나열합니다.
위 예에서 MRO는 [Third, First, Second, object]입니다. 이 순서는 Third부터 시작하여 상위 클래스 트리 아래로 이동하면서 메서드 호출 및 속성 조회를 해결하는 데 사용됩니다.
사용자 정의 및 모호성
Python은 일반적으로 MRO는 자동으로 mro 속성을 사용하여 사용자 정의할 수 있습니다. 그러나 MRO가 모호하지 않은지 확인하는 것이 중요합니다. 그렇지 않은 경우 Python은 예외를 발생시킵니다.
다음과 같은 모호한 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
MRO 이해
super()가 다중 상속과 상호 작용하는 방식을 완전히 이해하려면 다음이 중요합니다. MRO의 개념을 이해합니다. MRO의 구성 및 해결을 관리하는 규칙을 이해함으로써 개발자는 super()를 효과적으로 사용하고 다중 상속 시나리오에서 잠재적인 충돌을 피할 수 있습니다.
위 내용은 Python의 `super()` 함수는 다중 상속에서 MRO(메서드 결정 순서)를 어떻게 처리합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!