본문 바로가기

Python/Python

[Python] 클래스 상속 시 super() 의 쓰임

반응형

이번 포스팅에서는 Python에서 부모 클래스를 상속받을 때 자주 사용하는 super() 메소드에 대해 헷갈렸던 점을 기록하고자 한다. 우선 다음과 같은 부모 클래스가 있다고 가정하자.

 

Python

 

class Parent:
	def __init__(self, p1, p2):
    	self.p1 = p1
        self.p2 = p2
    
    def add_string(self):
    	return self.p1 + '+' + self.p2

 

위 Parent 클래스 생성자 함수에 인자(argument)가 필요한 상태이다. 이 상태에서 우리는 Parent 클래스를 상속받는 Child 클래스를 만들어보자.

 

class Child(Parent):
    def __init__(self):
        self.c1 = 'child1'

# 클래스 정의
child = Child(p1='parent1', p2='parent2')

 

이렇게 하면 코드가 정상 작동할까? 이렇게 하면 TypeError: __init__() got an unexpected keyword argument 'p1' 이라는 에러가 발생할 것이다. 자식 클래스인 Child 클래스 생성자에 super() 메소드를 넣어주어서 상속받고 있는 부모 클래스인 Parent 클래스에 접근이 가능토록 해야 한다. 그러면 다음과 같이 수정해보자.

 

class Child(Parent):
	def __init__(self):
    	super(Parent, self).__init__()
        self.c1 = 'child1'
        
# 클래스 정의
child = Child(p1='parent1', p2='parent2')

 

이렇게 하면 정상 작동할까? 이것도 TypeError: __init__() got an unexpected keyword argument 'p1' 이라는 에러가 발생할 것이다. super() 메소들르 넣어주었는데도 왜 에러가 발생할까? 바로 부모 클래스인 Parent 클래스의 생성자 함수에 p1, p2라는 argument가 있기 때문이다. 그래서 자식 클래스인 Child에서도 Parent 클래스에 접근할 때 p1, p2 argument가 필요하다라고 알려주어야 하기 때문에 다음과 같이 **kwargs 로 인자를 추가해주자.

 

class Child(Parent):
	def __init__(self, **kwargs):
    	super(Child, self).__init__(**kwargs)
        self.c1 = 'child1'

# 클래스 정의
child = Child(p1='parent1', p2='parent2')
child.add_string()

 

이렇게 하면 정상적으로 결과가 출력됨을 확인할 수 있다. 참고로 super().__init__(**kwargs) 로 대체할 수 있긴 하지만 이는 파이썬 3.x 버전의 문법이고 위 코드블럭의 표현이 파이썬 2.x 버전이라고 한다. 그런데 파이썬 3.x 버전에는 2.x 버전의 문법을 같이 사용할 수 있으므로 코드의 범용성을 위해서 파이썬 2.x 버전의 문법을 활용하는 것이 좋다고 한다..!


🔗 Reference

- Python의 Super() 사용방법

 

클래스 상속 및 super 함수의 역할

파이썬 클래스 상속 및 super 함수의 역할에 대해 정리해 보았습니다.

velog.io

 

반응형