개요
이전에 2024.04.22-[Python] 상속과 오버라이딩에서 Python에서의 클래스 상속에 대해서 정리하면서 super 함수를 언급했었다.
이번 글에서는 관련 개념을 좀 더 정리해 본다.
super
super는 부모 또는 형제 클래스에 메서드 호출을 위임하는 프록시 객체를 반환한다. 클래스에서 재정의된 메서드를 접근할 때 유용하다.
class super(type, object_or_type=None)
type 매개변수에는 자식 클래스의 이름을 전달하고, object_or_type에는 프록시 객체를 반환받을 객체를 전달한다. 즉. super는 type으로 전달한 클래스의 부모 클래스에 접근한다.
참고로 Python 2까지는 type과 object_or_type을 명시적으로 지정해야 했으나 Python 3까지는 매개변수를 지정하지 않으면 자동으로 type에 현재 클래스의 이름, object_or_typer에 self가 전달된다.
예시
- super에 매개변수 미지정
다음과 같이 A -> B -> C 순서로 상속 관계인 클래스가 정의되어 있다고 하자.
class A:
def __init__(self):
print('A')
class B(A):
def __init__(self):
print('B')
class C(B):
def __init__(self):
super().__init__()
클래스 C의 생성자는 부모 클래스의 생성자를 사용하도록 정의했다. 의도한 대로 동작하는지 확인하고자 객체를 생성해 보면,
c = C()
B 클래스의 생성자가 호출된 것을 확인할 수 있다.
- super에 매개변수 지정
이번에는 클래스 B를 상속받는 클래스 D를 정의하되 생성자에 부모 클래스의 생성자를 사용하도록 정의한다. 이번에는 super에 매개변수를 현재 클래스의 이름을 전달했다.
class D(B):
def __init__(self):
super(D, self).__init__()
- super로 부모의 부모 클래스 접근
이번에는 클래스 B를 상속받는 클래스 E를 정의하되 생성자에 부모의 부모 클래스를 접근하도록 정의한다. super의 type 매개변수에 클래스 B를 전달한다.
class E(B):
def __init__(self):
super(B, self).__init__()
의도한 대로 B 클래스의 부모 클래스인 클래스 A의 생성자가 호출된 모습을 확인할 수 있다.
참고 문서
https://docs.python.org/3/library/functions.html#super