본문 바로가기
컴퓨터 언어/Python

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

by SuperMemi 2022. 8. 15.
반응형

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


[ 이전 글 ]

클래스(Class)를 제대로 알아보자! (인스턴스 속성, 클래스 속성, 메소드)

 

[ Python 3 ] 파이썬의 클래스(Class)를 제대로 알아보자! (인스턴스 속성, 클래스 속성, 메소드)

[ Python 3 ] 파이썬의 클래스(Class)를 제대로 알아보자! (인스턴스 속성, 클래스 속성, 메소드) 간단하게 클래스와 객체가 무엇인지는 다들 잘 아실 겁니다. 그러나 클래스 안의 데이터와 메

supermemi.tistory.com

클래스 상속(inheritance)을 제대로 알아보자!

 

[ Python 3 ] 클래스 상속(inheritance)을 제대로 알아보자!

[ Python 3 ] 클래스 상속(inheritance)을 제대로 알아보자! [ 이전 글 ] 클래스(Class)를 제대로 알아보자! (인스턴스 속성, 클래스 속성, 메소드) [ Python 3 ] 파이썬의 클래스(Class)를 제대로 알아보자..

supermemi.tistory.com

클래스의 super( ) 에 대해 제대로 알아보자! ( super().__init__(), super()의 위치)

 

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

[ Python 3 ] 클래스의 Super( ) 에 대해 제대로 알아보자! ( super().__init__(), super()의 위치) [ 이전 글 ] 클래스(Class)를 제대로 알아보자! (인스턴스 속성, 클래스 속성, 메소드) [ Python 3..

supermemi.tistory.com


[ super().__init__() vs. super(클래스,self).__init__() ]

 

파이썬의 클래스를 쓰다보면 상속을 받게되는 일이 많습니다.

어떤 상속에서는 super()를 쓰고, 어떤 상속에서는 super(클래스, self)를 사용합니다.

 

 

좌측 예시에서는 super().__init__() 을 사용

우측 예시에서는 super(Student,self).__init__() 을 사용하였습니다.

 

이는 어떤 뜻이나면, 자식 클래스(Student)가 상속받는 부모 클래스(Human)를 자식 클래스(Student)에 불러오겠다 는 의미입니다.

 

class Student(Human):
    def __init__(self):
        super(Student,self).__init__()

 

 

결론을 우선 말씀드리면, 이런 경우엔 python 3에서 두 함수가 기능적으로는 차이가 없습니다.

 

super().__init__() → python 3 에서만 작동

super(클래스,self).__init__() → python 2,3 모두 작동

 

두 버전 모두에서 작동되는 방식임으로 아래와 같이 작성하는 경우가 많습니다.

 


[ 다중 상속에서의 super( ).__init__() ]

 

예시를 바꿔보겠습니다.

A → B → C 순서로 상속을 진행했습니다.

따라서, C는 A와 B의 모든 것을 보유 하고 있지요.

 

class A:
    def __init__(self):
        self.a = 10

    def get_a(self):
        return self.a

class B(A):
    def __init__(self):
        super().__init__()
        self.b = 20

    def get_b(self):
        return self.b

class C(B):
    def __init__(self):
        super().__init__()
        self.c = 30

    def get_c(self):
        return self.c

[ 연속 상속에서의 super(자식 클래스, self).__init__() ]

 

A → B → C 순서로 상속을 진행했습니다.

위의 super().__init__() 과 완전히 동일한 기능입니다. 

자식클래스가 상속받는 부모 클래스를 불러 오게 됩니다.

class A:
    def __init__(self):
        self.a = 10

    def get_a(self):
        return self.a

class B(A):
    def __init__(self):
        super(B,self).__init__()
        self.b = 20

    def get_b(self):
        return self.b

class C(B):
    def __init__(self):
        super(C,self).__init__()
        self.c = 30

    def get_c(self):
        return self.c

 


[ 연속 상속에서의 super(부모 클래스, self).__init__() ]

 

이번에는 조금 바꿔 보겠습니다.

앞의 예시에서는 A → B → C 순서로 상속을 받아왔는데요.

 

이번 예시에서는 class C 에서 super(C,self).__init__() 이 아닌, super(B,self).__init__() 으로 작성했습니다.

 

이렇게 되면 class C 는 B에서 상속받는 것이 아니라, B의 부모 클래스인 A의 메소드를 상속받게 됩니다.

 

따라서 get_b() 메소드는 class C(B)에 의해 상속 받았지만,

클래스 B의 인스턴스 속성인 self.b 는 class C에 존재하지 않게 됩니다. 

 

 

class A:
    def __init__(self):
        self.a = 10

    def get_a(self):
        return self.a

class B(A):
    def __init__(self):
        super(B,self).__init__()
        self.b = 20

    def get_b(self):
        return self.b

class C(B):
    def __init__(self):
        super(B,self).__init__()
        self.c = 30

    def get_c(self):
        return self.c

new_c = C()
print(new_c.get_a())
print(new_c.get_c())
print(new_c.get_b())

 


[ 정리 ]

 

Point 1) super(클래스명, self) 와 같이 super() 안에 어떠한 클래스 이름을 집어 넣는다는 것은 클래스명의 부모 클래스를 불러와 임시적인 객체를 형성하는 것이라고 할 수 있습니다. 

 

Point 2) super()와 동일한 역할을 하기 위해서는 super()에 자식 클래스 자기자신의 이름을 넣어야 합니다.

 

Point 3) 임시적인 객체 형성은 상속받는 클래스의 인스턴스 속성과 메소드를 직접 불러오기 위함 입니다.

 

Point 4) "class 클래스 이름(부모 클래스이름)" 의 역할은 부모 클래스의 메소드와 클래스 속성을 상속받기 위함 입니다. super()의 역할과 다릅니다. 


 

 

반응형