Python

[Python] super - 부모 클래스 접근

비번변경 2024. 10. 25. 11:34

개요

이전에 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

https://stackoverflow.com/questions/54162783/difference-between-super-and-super-classname-self-in-python

[ Python 3 ] super(클래스, self).__init__() 에 대해 제대로 알아보자!!

https://dojang.io/mod/page/view.php?id=2386