파이썬은 하나 이상의 클래스를 상속받을 수 있다.
class A1():
def print_a(self):
print("A1")
class A2():
def print_a2(self):
print("A2")
class B2(A1, A2):
pass
b = B2()
# 둘 다 사용가능
b.print_a()
b.print_a2()
둘 뿐만이 아니라 더 많은 클래스를 상속할 수 있는데,
만약 클래스 상속이 더 복잡해질 경우
class A1():
def __init__(self):
print("A1")
class A2():
def __init__(self):
print("A2")
class B2(A1, A2):
def __init__(self):
print("B2")
b = B2()
위와 같이 사용하는 함수가 겹칠 우려가 있다.
기본 1:1 상속에서는 부모 클래스의 메서드를 사용하기 위해서는 super()
를 통해서 부모 함수의 메서드를 부르면 되지만 만약 다중상속일 경우엔 B2 메서드에서 super()
를 호출하면 어떤 클래스가 불러지게 될까?
상속한 클래스중 가장 먼저 적은 A1의 메서드를 호출하게 된다.
이 순서는 클래스의 스페셜 메서드인 mro()
(Method Resolution Order)로 확인이 가능하다.
>>> B2.mro()
<class '__main__.B2'>, <class '__main__.A1'>, <class '__main__.A2'>, <class 'object'>]
만약 이럴때 super()
로 A1이 아닌 A2를 호출하고 싶다면 B2에서 A2.__init__(self)
를 작성해주면 된다.