>  기사  >  백엔드 개발  >  Python 하위 클래스는 다중 상속에서 MRO를 어떻게 사용합니까?

Python 하위 클래스는 다중 상속에서 MRO를 어떻게 사용합니까?

WBOY
WBOY앞으로
2023-04-19 18:19:131534검색

하위 클래스는 다중 상속에서 MRO 메커니즘을 사용합니다.

Python에서는 클래스를 정의할 때 상위 클래스를 지정할 수 있습니다. 하위 클래스는 상위 클래스의 모든 속성과 메서드를 상속하며 고유한 속성과 메서드를 추가할 수 있습니다.

그러나 클래스에 직접 상위 클래스가 여러 개 있는 경우 이러한 상위 클래스 간에 이름이 같은 속성과 메서드가 있을 수 있습니다. 이러한 속성과 메서드를 올바르게 호출하기 위해 Python은 "Method Resolution Order"(MRO)라는 알고리즘을 사용하여 속성과 메서드의 검색 순서를 결정합니다.

알고리즘 원리

Python 2.x에서 MRO는 깊이 우선 검색 알고리즘(DFS)을 사용하여 구현됩니다. 이 알고리즘에는 경우에 따라 메서드 호출 순서가 올바르게 구문 분석되지 않는 몇 가지 문제가 있습니다. 예:

class A:
    def foo(self):
        print("A.foo")

class B(A):
    pass

class C(A):
    def foo(self):
        print("C.foo")

class D(B, C):
    pass

d = D()
d.foo()  # 输出"A.foo",而不是"C.foo"

위 코드에서 클래스 D는 클래스 B와 클래스 C를 상속하고 클래스 C는 클래스 A의 foo() 메서드를 재정의합니다. 따라서 d 객체의 foo() 메소드를 호출할 때에는 이론적으로 C 클래스의 foo() 메소드를 먼저 호출해야 한다. 그러나 Python 2.x는 DFS 알고리즘을 사용하므로 클래스 B를 먼저 통과한 다음 클래스 C, 마지막으로 클래스 A를 통과합니다. 따라서 클래스 C의 foo() 메서드가 아닌 클래스 A의 foo() 메서드가 최종적으로 호출됩니다.

이 문제를 해결하기 위해 Python 2.3에서는 메소드 호출 시 정확성을 보장하기 위해 위상 정렬 알고리즘을 사용하여 MRO 목록을 계산하는 C3 알고리즘을 도입했습니다. C3 알고리즘의 기본 원리는 다음과 같습니다.

  • 새로운 클래스(즉, 명시적으로 객체를 상속하거나 암시적으로 객체를 상속하는 클래스)의 MRO 목록은 BFS(Breadth First Search) 알고리즘에 따라 계산됩니다.

  • 각 클래스에 대해 해당 MRO 목록은 다음 세 가지 조건을 충족해야 합니다.

    • 하위 클래스의 MRO 목록은 상위 클래스의 MRO 목록 앞에 순위가 지정되어야 합니다.

    • 두 개의 상위 클래스가 하위 클래스의 MRO 목록에 나타나는 경우 목록의 상대 순서는 하위 클래스의 직접 상위 클래스의 상대 순서와 동일해야 합니다.

    • 수업은 MRO 목록에 두 번 이상 나타날 수 없습니다.

이 알고리즘은 위 예제 코드의 상황을 올바르게 처리할 수 있으므로 메서드 호출 시 정확성이 보장됩니다.

MRO 목록 보기

Python 3에서는 __mro__ 속성을 ​​통해 클래스의 MRO 목록을 볼 수 있습니다. 예: __mro__属性来查看类的MRO列表。例如:

class A:
    def foo(self):
        print("A.foo")

class B(A):
    pass

class C(A):
    def foo(self):
        print("C.foo")

class D(B, C):
    pass

print(D.__mro__)

输出结果为:

(2c80631a2a60f09db0db08b479b83c38, 8d660e54b264e36727cf2fd8e79d0fc1, 7ab913e23eec5fc1819bf61fa9f4a7de, 2282f191c7bda9371fce73ccb964a6ec, 0e122eba0a2a294242e197bbe224b40e)

其中,2c80631a2a60f09db0db08b479b83c38表示类D本身,8d660e54b264e36727cf2fd8e79d0fc17ab913e23eec5fc1819bf61fa9f4a7de分别表示类D的父类B和C,2282f191c7bda9371fce73ccb964a6ec表示类B和C的共同父类A,0e122eba0a2a294242e197bbe224b40errreee

출력 결과는 다음과 같습니다. 🎜
🎜(025dcfa56ce70cf61f231bd7d6b09a90, d3d10dde313d07caf2874a0faa31cc27, 264899d62e4ca0da0ab3f6eed2baa002, 4b3b2409a97cf182005498fefda620e1, 0b6b3070adce8118f880cf43f8bc8037)
🎜
🎜그 중 <class> 클래스 D 자체를 나타내고 <code><class> 및 <code><class>는 각각 클래스의 상위 클래스 B와 C를 나타냅니다. D, <code><class>는 클래스 B와 C의 공통 상위 클래스 A를 나타내고, <code><class>는 기본 클래스를 나타냅니다. 모든 새로운 스타일 클래스의 클래스. 이 목록의 순서는 Python이 실행될 때 속성과 메서드가 조회되는 순서입니다. 🎜</class>

위 내용은 Python 하위 클래스는 다중 상속에서 MRO를 어떻게 사용합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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