>  기사  >  백엔드 개발  >  Python 다중 상속의 다이아몬드 상속

Python 다중 상속의 다이아몬드 상속

angryTom
angryTom앞으로
2020-02-12 12:45:034156검색

이 기사는 Python 다중 상속에서 다이아몬드 상속의 사용법을 소개합니다. Python을 배우는 친구들에게 도움이 되길 바랍니다!

Python 다중 상속의 다이아몬드 상속

상속은 객체 지향 프로그래밍의 중요한 방법입니다. 상속을 통해 하위 클래스는 상위 클래스의 기능을 확장할 수 있습니다. Python에서는 클래스가 둘 이상의 상위 클래스에서 상속될 수 있습니다. 이를 Python의 다중 상속이라고 합니다.

Syntax

class SubclassName(BaseClass1, BaseClass2, BaseClass3, ...):
    pass

Rhombus 상속

추천 학습: Python 동영상 튜토리얼

다단계 상속과 다중 상속을 동시에 사용하면 복잡한 상속 관계, 다중 다중 상속이 나타납니다.

그 중에 다이아몬드 상속이 등장합니다. 아래 그림과 같습니다. Python 다중 상속의 다이아몬드 상속

이 구조에서는 호출 순서에 혼동이 있습니다.

  • D->B->A->C(깊이 우선)
  • D->B->C->A(너비 우선)

이 질문에 답해 보겠습니다.

예를 들어 보겠습니다.

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...

호출 순서를 볼 수 있습니다. 이때는 D -> B -> C -> A입니다. 즉, 순회 방법은

너비 우선입니다.

보충 내용

Python 클래스는 두 가지 유형으로 나뉘는데, 하나는

클래식 클래스이고 다른 하나는 새로운 스타일 클래스입니다. 둘 다 다중 상속을 지원하지만 상속 순서가 다릅니다.

  • 새로운 스타일 클래스: 객체에서 상속된 클래스입니다. (예: 클래스 A(객체)), 폭 우선 검색을 사용하여 상속됩니다(즉, 먼저 수평 검색한 다음 상향 검색).
  • 클래식 클래스: 객체에서 상속되지 않는 클래스입니다. (예: 클래스 A()), 깊이 우선검색 방법을 사용하여 상속합니다(즉, 먼저 상속 트리의 왼쪽으로 깊숙이 들어가서 반환된 다음 오른쪽을 찾습니다).
Python 2.x에는 클래식 클래스와 새로운 스타일 클래스라는 두 가지 유형의 클래스가 있습니다.

Python3.x에는 새로운 스타일의 클래스가 가득합니다.

더 많은 Python 관련 튜토리얼을 보려면

python tutorial 칼럼을 주목해 주세요.

위 내용은 Python 다중 상속의 다이아몬드 상속의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 cnblogs.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제