>  기사  >  백엔드 개발  >  Python의 레거시 클래스와 새로운 스타일 클래스 간의 MRO(메서드 해결 순서)는 어떻게 다릅니까?

Python의 레거시 클래스와 새로운 스타일 클래스 간의 MRO(메서드 해결 순서)는 어떻게 다릅니까?

Barbara Streisand
Barbara Streisand원래의
2024-10-28 05:49:02172검색

How Does Method Resolution Order (MRO) Differ Between Legacy and New-Style Classes in Python?

레거시 클래스와 새 스타일 클래스의 MRO(메서드 결정 순서) 차이점

Python의 새 스타일 클래스는 레거시 클래스와 비교한 MRO(메서드 해결 순서) 제공된 예는 새로운 스타일 클래스에 대한 MRO 해상도를 올바르게 보여주지만 두 접근 방식을 구별하는 미묘한 차이점을 살펴보겠습니다.

주요 차이점은 상위 클래스가 "순진한" 깊이에서 여러 번 나타날 때 나타납니다. 첫 번째 해결 명령. 다음 "다이아몬드 상속" 사례를 고려하십시오.

class A:
    x = 'a'

class B(A):
    pass

class C(A):
    x = 'c'

class D(B, C):
    pass

레거시 클래스를 사용하는 경우 해결 순서는 D - B - A - C - A입니다. 이 순서에서 A가 먼저 발생하므로 결과는 다음과 같습니다. C의 후속 정의에 의해 'x' 정의가 숨겨집니다.

D.x => 'a'

그러나 새로운 스타일 클래스는 수정된 MRO를 채택합니다.

D.__mro__ = (<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <type 'object'>)

이 순서는 상위 클래스가 나타나도록 합니다. 단 한 번만, 그리고 모든 하위 클래스 후에. 결과적으로 C의 'x' 수정과 같은 재정의가 우선합니다.

D.x => 'c'

해결 순서에서 상위 클래스가 여러 번 나타나는 것을 방지함으로써 이 접근 방식은 모호성을 제거하고 복잡한 상속 계층에서 직관적인 동작을 보장합니다. 이것이 바로 특히 다중 상속 및 다이아몬드형 패턴을 다룰 때 이전 스타일 클래스를 피하고 새로운 스타일 클래스를 선호하는 이유입니다.

위 내용은 Python의 레거시 클래스와 새로운 스타일 클래스 간의 MRO(메서드 해결 순서)는 어떻게 다릅니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.