본문 바로가기
C.W.K.
Stream
Lesson 01 of 05 · published

다중 상속과 MRO — 다음 구현은 어디일까

~22 min · mro, multiple-inheritance, c3, super

Level 0호기심
0 XP0/93 lessons0/23 achievements
0/100 XP to next level100 XP to go0% complete

Python은 C3 선형화로 한 줄의 탐색 순서를 만든다

다중 상속에서도 메서드를 찾는 순서는 모호하지 않아. 클래스 자신이 부모보다 먼저, 부모는 선언된 순서를 지키며, 같은 조상은 한 번만 나타나는 MRO를 만들어. 이 조건을 함께 만족할 수 없으면 클래스 정의를 거부해.

super는 부모 이름이 아니라 다음 MRO를 부른다

다이아몬드 구조에서 모든 클래스가 super()로 협력하면 공통 조상도 한 번만 호출돼. 각 메서드는 자신이 쓸 인자를 꺼내고 남은 인자를 넘기며, 체인을 중간에서 끊지 않아야 해.

원칙: 다중 상속을 쓴다면 모든 참여 클래스가 같은 호출 계약으로 협력해야 해. 한 클래스라도 부모를 직접 부르면 MRO의 보장이 깨져.

Code

클래스의 MRO 확인하기·python
class A: pass
class B(A): pass
class C(A): pass
class D(B, C): pass

for cls in D.__mro__:
    print(cls.__name__)
# D
# B
# C
# A
# object

# 같은 거 — 정렬된 list:
print([c.__name__ for c in D.mro()])
MRO 순서로 메서드 찾기·python
class A:
    def name(self): return "A"

class B(A):
    def name(self): return "B"

class C(A):
    def name(self): return "C"

class D(B, C):
    pass

print(D().name())          # 'B'   — D 다음 MRO 첫 번째
모든 클래스가 협력하는 super 호출·python
class A:
    def __init__(self, **kwargs):
        print("A.__init__")
        super().__init__(**kwargs)

class B(A):
    def __init__(self, **kwargs):
        print("B.__init__")
        super().__init__(**kwargs)

class C(A):
    def __init__(self, **kwargs):
        print("C.__init__")
        super().__init__(**kwargs)

class D(B, C):
    def __init__(self, **kwargs):
        print("D.__init__")
        super().__init__(**kwargs)

D()
# D.__init__
# B.__init__
# C.__init__
# A.__init__
# 각 클래스 한 번씩, MRO 순서로 — super() 덕분
일관된 순서를 만들 수 없는 상속·python
class A: pass
class B(A): pass
class C(A): pass

# 작동 — D 부모 (B, C), 둘 다 A 가 부모.
class D(B, C): pass

# 안 됨 — 부모 순서 모순
try:
    class Bad(B, C, B):
        pass
except TypeError as e:
    print("MRO 충돌:", e)

External links

Exercise

Vehicle, Wheeled(Vehicle), Engined(Vehicle), Car(Wheeled, Engined)을 만들고 모두 __init__(**kwargs)에서 이름을 출력한 뒤 super로 넘겨. Car를 만들 때의 순서와 Car.__mro__가 같은지 확인하고, 네 클래스가 각자 추가한 속성이 최종 인스턴스에 모두 남게 해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.