프로그래밍파이썬 선임 개발자

파이썬에서 상속 모델과 super()의 작동 원리를 설명하십시오. 다중 상속에서 super() 사용의 특징은 무엇이며 어떤 오류를 범할 수 있습니까?

Hintsage AI 어시스턴트로 면접 통과

답변.

파이썬은 다중 상속을 지원하며, 부모 메소드 호출은 메소드 해결 순서(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 메소드는 호출되지 않습니다

주제에 대한 잘못된 이해로 인한 실제 오류 예.


이야기

거대한 GUI 구성 요소 상속에서 중간 클래스 중 하나가 super().__init__()를 호출하는 것을 잊었습니다. 결과적으로 일부 위젯이 제대로 초기화되지 않았고, 이는 드문 버그로만 나타났습니다.

이야기

REST API 서버에서 슈퍼클래스에 의존하는 로그 기록기는 MRO에 따라 모든 요청에 "연결"되어야 했습니다. 한 클래스가 직접 로그 기록기를 호출했기 때문에 super()를 통해 호출되지 않아 호출 체인이 깨졌고, 메시지가 기록되지 않았습니다 — 팀은 원인을 오랜 시간 동안 찾고 있었습니다.

이야기

복잡한 믹스인의 계층 구조에서 하나의 메소드가 super()를 호출하는 것을 "잊어버렸습니다". 이로 인해 하나의 API 엔드포인트에서 유효성 검사가 작동하지 않았고 다른 엔드포인트에서는 제대로 작동했습니다. 팀은 수주 동안 MRO를 수동으로 분석하여 문제를 찾아냈습니다.