Python 다중 상속, 다단계 상속, 메서드 결정 순서(MRO) 마스터하기
Python 다중 상속
Python이 다중 상속을 어떻게 지원하는지, 다단계 상속의 뉘앙스, 메서드 결정 순서(MRO)가 속성 조회를 어떻게 지배하는지 탐구합니다.
Python 다중 상속
Python은 클래스가 하나 이상 베이스 클래스에서 상속받는 걸 허용합니다. C++처럼요. 이 기능을 다중 상속이라 하며 파생 클래스가 여러 부모 클래스의 행동을 결합할 수 있게 합니다.
문법은 단일 상속과 유사: 괄호 안에 모든 부모 클래스 나열, 쉼표로 구분.
예제
class Base1:
pass
class Base2:
pass
class MultiDerived(Base1, Base2):
pass
이 예에서 MultiDerived는 Base1과 Base2의 속성/메서드 상속.
다이어그램: MultiDerived가 Base1과 Base2에서 기능 수신.
Python 다단계 상속
두 레벨 넘어 상속 체인 가능: 클래스가 파생 클래스에서 상속받아 다단계 상속 계층 형성. Python은 임의 깊이 지원.
각 새 파생 클래스는 직계 부모에서 상속받으며 조상 속성도 계승.
예제:
class Base:
pass
class Derived1(Base):
pass
class Derived2(Derived1):
pass
여기서 Derived1이 Base 확장, Derived2가 Derived1 추가 확장해 3단계 체인 형성.
Python 메서드 결정 순서(MRO)
모든 Python 클래스는 궁극적으로 object에서 상속받으며, 이는 보편적 베이스 타입. 결과적으로 모든 객체는 내장이든 사용자 정의든 object 인스턴스:
# 출력: True
print(issubclass(list, object))
# 출력: True
print(isinstance(5.5, object))
# 출력: True
print(isinstance("Hello", object))
다중 상속 시 Python은 깊이 우선, 왼쪽에서 오른쪽으로 순회하며 클래스 두 번 방문 안 함. 이 순회 순서를 메서드 결정 순서(MRO)라 하며 클래스가 부모보다 먼저 나타나게 보장.
MultiDerived MRO: [MultiDerived, Base1, Base2, object]. __mro__ 속성이나 mro() 메서드로 확인 가능:
MultiDerived.__mro__
# (<class '__main__.MultiDerived'>, <class '__main__.Base1'>, <class '__main__.Base2'>, <class 'object'>)
MultiDerived.mro()
# [<class '__main__.MultiDerived'>, <class '__main__.Base1'>, <class '__main__.Base2'>, <class 'object'>]
복잡한 상속 그래프도 같은 원칙. 다음 예제 고려:
# MRO 시연
class X:
pass
class Y:
pass
class Z:
pass
class A(X, Y):
pass
class B(Y, Z):
pass
class M(B, A, Z):
pass
print(M.mro())
# 출력:
# [<class '__main__.M'>, <class '__main__.B'>, <class '__main__.A'>, <class '__main__.X'>, <class '__main__.Y'>, <class '__main__.Z'>, <class 'object'>]
MRO 계산 알고리즘 더 깊게는 공식 Python 문서 클래스 상속과 MRO 논의 참조.