프로그래밍선임 Python 개발자

Python에서 super() 함수의 작동 방식을 설명하고, 그 목적, 사용의 특징 및 일반적인 사용 오류에 대해 설명하십시오.

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

답변.

문제의 역사:

super() 함수는 상속 작업을 단순화하기 위해 등장하였습니다. 그것이 등장하기 전에는 부모 클래스의 메서드를 호출할 때 명시적으로 부모 클래스의 이름을 지정해야 했기 때문에 믹스인과 다중 상속이 불편해지고 오류를 초래할 수 있었습니다. super()는 상속 순서를 고려합니다 (MRO).

문제:

다중 상속에서 부모 클래스에 직접 접근하는 경우 종종 그 클래스의 메서드만 호출하고 다른 조상을 무시하므로 호출 체인이 깨집니다. super()의 작업은 계층 구조를 고려한 메서드 체인을 올바르게 구축하는 것입니다.

해결책:

super()는 호출을 MRO의 다음 클래스에 위임하는 프록시 객체를 반환합니다. 이를 통해 모든 조상의 메서드를 일관되게 호출할 수 있습니다.

코드 예시:

class A: def show(self): print("A.show()") class B(A): def show(self): print("B.show() -> ", end="") super().show() class C(A): def show(self): print("C.show() -> ", end="") super().show() class D(B, C): def show(self): print("D.show() -> ", end="") super().show() d = D() d.show() # 출력: D.show() -> B.show() -> C.show() -> A.show()

주요 특징:

  • super()는 MRO (Method Resolution Order)를 따르며, 클래스 이름에 의존하지 않습니다.
  • new-style 클래스와만 작동합니다 (Python 3에서는 모든 클래스가 new-style입니다).
  • 다중 상속을 올바르게 초기화하고 작업하기 위해 사용됩니다.

속임수 질문.

정적 메서드에서 인수 없이 super를 사용할 수 있나요?

아니요, 정적 메서드에는 self나 cls가 없습니다. super()는 인스턴스나 클래스 메서드에서 호출되어 객체 유형에 대한 정보를 기대합니다.

super() 호출 체인에서 부모 메서드를 생략하면 호출됩니까?

아니요. 호출 체인에서 super()를 호출하지 않으면 실행이 "앞으로 전달되지" 않습니다. 따라서 메서드를 재정의할 때는 항상 super()를 기억하는 것이 중요하며, 그렇지 않으면 조상의 일부 로직이 생략될 것입니다.

마음대로 인수를 super()에 전달할 수 있나요?

가능하지만, 인수 없이 일반적인 형태의 super() (Python 3)는 오류를 피하고 코드를 더 깔끔하게 보이게 합니다. 인수를 전달할 필요는 드물고 (예: Python 2와 호환성) 일반적으로 필요하지 않습니다.

일반적인 오류 및 안티 패턴

장점:

  • 계층 구조 내에서 코드 중복을 피할 수 있습니다.
  • 모든 조상에 대한 호출의 순서를 보장합니다. 단점:
  • MRO의 오류는 감지하기 어려운 버그를 초래합니다.
  • super()를 생략하면 호출 체인이 모두 깨집니다.

실생활 예시

부정적인 케이스: 큰 프로젝트에서 부모 클래스가 초기화를 포함하고 있었지만 하위 클래스 중 하나가 super().init()을 호출하는 것을 잊었습니다. 그 결과 부분적으로 초기화된 속성이 없는 객체가 생성되었습니다.

장점: 각 부모 클래스를 수동으로 호출할 필요가 없었습니다. 단점: 누군가 super()를 생략한 경우 추적이 복잡합니다.

긍정적인 케이스: 잘 구현된 super() 체인은 모든 기본 클래스의 올바른 초기화를 보장하여 아키텍처의 유지 보수 및 발전을 단순화했습니다.

장점: 코드의 청결함, 확장성의 용이함. 단점: 복잡한 MRO에서 실수를 쉽게 할 수 있으며 호출 순서를 이해해야 합니다.