이 기사는 Python 다중 상속에서 다이아몬드 상속의 사용법을 소개합니다. Python을 배우는 친구들에게 도움이 되길 바랍니다!
상속은 객체 지향 프로그래밍의 중요한 방법입니다. 상속을 통해 하위 클래스는 상위 클래스의 기능을 확장할 수 있습니다. Python에서는 클래스가 둘 이상의 상위 클래스에서 상속될 수 있습니다. 이를 Python의 다중 상속이라고 합니다.
Syntax
class SubclassName(BaseClass1, BaseClass2, BaseClass3, ...): pass
추천 학습: Python 동영상 튜토리얼
다단계 상속과 다중 상속을 동시에 사용하면 복잡한 상속 관계, 다중 다중 상속이 나타납니다.
그 중에 다이아몬드 상속이 등장합니다. 아래 그림과 같습니다.
이 구조에서는 호출 순서에 혼동이 있습니다.
이 질문에 답해 보겠습니다.
예를 들어 보겠습니다.
class A(): def __init__(self): print('init A...') print('end A...') class B(A): def __init__(self): print('init B...') A.__init__(self) print('end B...') class C(A): def __init__(self): print('init C...') A.__init__(self) print('end C...') class D(B, C): def __init__(self): print('init D...') B.__init__(self) C.__init__(self) print('end D...') if __name__ == '__main__': D()
출력 결과
init D... init B... init A... end A... end B... init C... init A... end A... end C... end D...
출력 결과에서 호출 순서는 D->B->A->C->A입니다. B와 C가 A를 공동으로 상속받고 A가 두 번 호출되는 것을 볼 수 있습니다. A를 두 번 호출할 필요가 없습니다.
사실 위 문제의 근본 원인은 모두 MRO와 관련이 있습니다. MRO(Method Resolution Order)는 Method Resolution Order라고도 합니다. 주로 다중 상속 중에 조정된 속성이 어느 클래스에서 나오는지 확인하는 데 사용됩니다. C3이라는 알고리즘의 기본 아이디어는 동일한 클래스가 여러 번 호출되는 것을 방지한다는 전제 하에 너비 우선 및 왼쪽에서 오른쪽 원칙을 사용하여 필요한 속성과 메서드를 찾는 것입니다.
그렇다면 최상위 부모 클래스의 메서드가 여러 번 호출되는 것을 방지하려면 super()가 필요합니다. C3 알고리즘은 이를 보장하기 때문에 본질적으로 MRO 정보를 기록합니다. 클래스는 한 번만 검색되므로 최상위 상위 클래스의 메서드가 여러 번 실행되는 것을 방지할 수 있습니다. 위 코드는 다음과 같이 변경할 수 있습니다.class A(): def __init__(self): print('init A...') print('end A...') class B(A): def __init__(self): print('init B...') super(B, self).__init__() print('end B...') class C(A): def __init__(self): print('init C...') super(C, self).__init__() print('end C...') class D(B, C): def __init__(self): print('init D...') super(D, self).__init__() print('end D...') if __name__ == '__main__': D()
init D... init B... init C... init A... end A... end C... end B... end D...
너비 우선입니다.
보충 내용Python 클래스는 두 가지 유형으로 나뉘는데, 하나는클래식 클래스이고 다른 하나는 새로운 스타일 클래스입니다. 둘 다 다중 상속을 지원하지만 상속 순서가 다릅니다.
Python3.x에는 새로운 스타일의 클래스가 가득합니다.
더 많은 Python 관련 튜토리얼을 보려면python tutorial 칼럼을 주목해 주세요.
위 내용은 Python 다중 상속의 다이아몬드 상속의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!