이번 포스팅에서는 Python에서 부모 클래스를 상속받을 때 자주 사용하는 super() 메소드에 대해 헷갈렸던 점을 기록하고자 한다. 우선 다음과 같은 부모 클래스가 있다고 가정하자.
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 > Python' 카테고리의 다른 글
[Python] Class 에서 return self 는 무엇을 의미할까? (0) | 2021.08.26 |
---|---|
[Python] yield로 제네레이터 함수 만들기 (0) | 2021.08.25 |
[Python 중급] 일급함수(First-class)와 클로저, 데코레이터 (0) | 2020.12.27 |
[Python 중급] Python 시퀀스 (0) | 2020.12.24 |
[Python 중급] Magic method와 named tuple (0) | 2020.12.22 |