Python의 super() 및 다중 상속
Python에서 다중 상속으로 인해 호출할 상위 메서드를 결정할 때 복잡성이 발생합니다. super() 함수는 이 시나리오에서 중요한 역할을 하지만 해당 동작은 MRO(메소드 해결 순서)에 따라 달라집니다.
MRO 및 super()
MRO는 상위 클래스에서 속성을 검색하는 순서를 정의합니다. 귀하의 예에서는
class Third(First, Second): def __init__(self): super(Third, self).__init__() print "that's it"
super(Third, self).__init__()가 MRO에 있는 첫 번째 클래스의 __init__() 메서드를 호출합니다. 이 경우에는 First입니다.
부모 메소드 선택
super()를 사용하여 호출할 상위 메소드를 명시적으로 선택할 수는 없습니다. MRO는 검색 순서를 지정하며 super()는 항상 해당 순서의 첫 번째 클래스를 참조합니다.
예(단일 경로 상속)
예제에서 교차 상속이 없으면 MRO는 간단합니다: [세 번째, 첫 번째, 두 번째, 객체]. 따라서 super(Third, self).__init__()는 항상 First.__init__()를 호출합니다.
예(교차 상속)
다음 코드를 고려하세요.
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는 이제 [4차, 2차, 3차, 첫째, 객체]. super(Fourth, self).__init__()는 MRO의 첫 번째 클래스인 Second.__init__()를 호출합니다.
모호한 MRO
상속 경로가 있는 경우交叉(예: First가 Second에서 상속됨) Python은 일관된 MRO를 설정할 수 없으므로 예외:
TypeError: Cannot create a consistent method resolution order (MRO) for bases Second, First
결론
super()는 다중 상속 작업을 위한 강력한 도구입니다. 그러나 MRO를 이해하는 것은 super().__init__()를 사용할 때 어떤 상위 메서드가 호출되는지를 결정하므로 해당 동작을 예측하는 데 중요합니다.
위 내용은 Python의 `super()` 함수는 다중 상속 및 MRO(메소드 해결 순서)와 어떻게 작동합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!