다중 상속 — 깊은 물
Python 은 한 클래스가 여러 부모 상속 가능. class C(A, B): 합법. 즉시 떠오르는 질문 — A 와 B 둘 다 method() 정의하면 C().method() 에서 누가 이김? 답은 *method resolution order* (MRO) — C3 알고리즘으로 계산된 상속 그래프의 결정적 선형화.
C3 알고리즘 — 룰, 증명 X
알고리즘 외울 필요 X. 그게 만드는 룰을 평이하게 — 클래스가 모든 부모보다 먼저 오고, 부모는 작성 순서로. Python 이 이 제약들 트리 전체에 결합해서 단일 순서. Cls.__mro__ 가 보여줘. 제약 만족 안 되면 클래스 정의 시점에 TypeError.
다중 상속의 super() — 협력 호출
단일 상속에서 super().method() 가 부모 메서드 호출. 다중 상속에선 *MRO 의 다음 클래스* 호출 — 부모 아닐 수도. 이게 "협력 다중 상속" — diamond 의 모든 클래스가 super() 호출 가능, 호출이 MRO 순서로 걸어 각 클래스 한 번씩.
원칙: 다중 상속 +
super() 섞을 때 체인의 모든 클래스가 **kwargs 받고 forward 해야 해. 한 클래스가 까먹으면 체인 깨져. 협력 다중 상속의 비용 — 그리고 대부분 Python 코드가 합성 선호하는 주된 이유.
Diamond — MRO 가 비자명한 이유
고전 케이스 — D 가 B 와 C 상속, 둘 다 A 상속. MRO 없으면 D().method() 호출 시 A.method 두 번 호출 위험. C3 가 모든 조상이 MRO 에 정확히 한 번 — 모든 로컬 부모 순서와 일관된 순서로.