[Python] 다중 상속, MRO
Python에선 다중으로 상속이 가능하다. 그래서 대표적인 상속 예시가 다이아몬드 상속이다.
class Base: def __init__(self): print('Base.__init__') class A(Base): def __init__(self): Base.__init__(self) print('A.__init__') class B(Base): def __init__(self): Base.__init__(self) print('B.__init__') class C(A,B): def __init__(self): A.__init__(self) B.__init__(self) print('C.__init__') if __name__ == '__main__': c = C()
Base.__init__ A.__init__ Base.__init__ B.__init__ C.__init__ |
위 코드는 Base라는 최상위 class가 두 번 호출된다. C++의 경우엔 virtual이라는 것을 통해 하나라는 것을 알 수 있지만 Python은 아니다. 이를 위해서 super()
키워드가 사용된다.
class Base: def __init__(self): print('Base.__init__') class A(Base): def __init__(self): super().__init__() print('A.__init__') class B(Base): def __init__(self): super().__init__() print('B.__init__') class C(A,B): def __init__(self): super().__init__() print('C.__init__') if __name__ == '__main__': c = C()
Base.__init__ B.__init__ A.__init__ C.__init__ |
이러한 동작 원리는 Python에선 MRO (Method Resolution Order) 멤버가 존재한다.
__mro__
C.__mro__
(__main__.C, __main__.A, __main__.B, __main__.Base, object) |
실제 A와 B는 같은 level의 부모지만 각 부모 자식의 관계가 link로 연결되어있다. 즉 부모를 tracking 하는 순서가 존재한다.