파이썬은 다중 상속을 지원하며, 부모 메소드 호출은 메소드 해결 순서(MRO — Method Resolution Order)를 통해 관리됩니다. super() 함수는 계층 구조에서 슈퍼클래스의 메소드를 호출할 수 있게 해주며, 특히 복잡한 상속에서 유용합니다.
**super()**는 MRO에 따라 메소드를 올바르게 호출하는 것을 보장하며, 즉각적인 부모뿐만 아니라 다른 부모도 포함됩니다.
class A: def do(self): print('A') class B(A): def do(self): print('B') super().do() class C(A): def do(self): print('C') super().do() class D(B, C): def do(self): print('D') super().do() D().do() # 출력: # D # B # C # A
주의 사항: 모든 메소드는 super()를 호출해야 하며, 그렇지 않으면 MRO가 "깨질" 수 있습니다. 또한, 생성자(__init__)는 super().__init__()를 호출해야 합니다.
질문: 다중 상속 계층에서 한 클래스가 자신의 메소드에서 super()를 "잊어버리면" 어떻게 됩니까?
답변: MRO가 깨져서 부모 메소드의 일부가 호출되지 않습니다. 예:
class A: def show(self): print('A') class B(A): def show(self): print('B') class C(A): def show(self): print('C') super().show() class D(B, C): def show(self): print('D'); super().show() D().show() # 출력: D B # A의 C 및 A 메소드는 호출되지 않습니다
이야기
super().__init__()를 호출하는 것을 잊었습니다. 결과적으로 일부 위젯이 제대로 초기화되지 않았고, 이는 드문 버그로만 나타났습니다.이야기
이야기
복잡한 믹스인의 계층 구조에서 하나의 메소드가 super()를 호출하는 것을 "잊어버렸습니다". 이로 인해 하나의 API 엔드포인트에서 유효성 검사가 작동하지 않았고 다른 엔드포인트에서는 제대로 작동했습니다. 팀은 수주 동안 MRO를 수동으로 분석하여 문제를 찾아냈습니다.