> 백엔드 개발 > 파이썬 튜토리얼 > Python의 `super()` 함수는 다중 상속 및 MRO(메소드 해결 순서)와 어떻게 작동합니까?

Python의 `super()` 함수는 다중 상속 및 MRO(메소드 해결 순서)와 어떻게 작동합니까?

Barbara Streisand
풀어 주다: 2024-12-30 08:26:08
원래의
423명이 탐색했습니다.

How Does Python's `super()` Function Work with Multiple Inheritance and Method Resolution Order (MRO)?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿