https://docs.python.org/3/tutorial/classes.html#multiple-inheritance
- 선언: class C(A, B, …): …처럼 왼쪽에서 오른쪽 순서대로 기반을 나열.
- 조회 순서(MRO): 단순 DFS가 아니라 C3 선형화로 결정된 일렬 리스트를 따릅니다. 속성/메서드 찾기는 이 MRO 순서대로 진행하며, 같은 클래스는 한 번만 방문.
- 이유: 다이아몬드 구조(여러 경로로 같은 부모)에 대해 중복 호출을 막고, 좌→우 선언 순서를 존중하며, 서브클래싱해도 기존 부모 우선순위가 뒤틀리지 않게 (단조성) 보장하기 위해.
- super()는 MRO를 따라 “다음” 클래스의 메서드를 호출하도록 설계돼 협력적 다중 상속을 지원합니다. super().foo()를 모든 클래스가 사용하면 각 부모가 정확히 한 번씩 호출됩니다.
MRO(Method Resolution Order)는 다중 상속 시 메서드·속성 조회 순서를 일렬로 정한 리스트입니다. 파이썬은 C3 선형화를 써서 좌→우 선언 순서를 존중하면서, 각 부모를 한 번만 방문하고, 서브클래싱해도 우선순위가 뒤틀리지 않도록(단조 성) 보장합니다. super()도 이 MRO를 따라 “다음” 클래스를 호출합니다.
class A: pass
class B(A): pass
class C(A): pass
class D(B, C): pass
print(D.__mro__)
# (<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>,
# <class '__main__.A'>, <class 'object'>)
- super()는 “현재 클래스 다음에 오는 MRO 순서”를 따라갑니다.
- class D(B, C)에서 D 안에서 super().foo()를 부르면
- MRO가 D → B → C → A → object라서
- 먼저 B의 foo가 호출됩니다.
- B 안에서 다시 super().foo()를 쓰면
- 그다음인 C를 호출하고,
- C에서 super()를 쓰면 A,
- 그다음 object 순으로 이어집니다.
- MRO가 D → B → C → A → object라서
super().foo()는 “MRO에서 현재 클래스 다음” 한 단계만 호출합니다.