Python:MethodResolutionOrder
method resolution order (메서드 결정 순서)는 조회하는 동안 멤버를 검색하는 베이스 클래스들의 순서입니다.
2.3 릴리스부터 파이썬 인터프리터에 사용된 알고리즘의 상세한 내용은 The Python 2.3 Method Resolution Order를 보면 됩니다.
확인 방법
MRO는 __mro__라는 클래스 속성을 통해 확인할 수 있습니다. 사족으로 이 속성은 튜플입니다.
출력은:
(<class '__main__.Son'>, <class '__main__.Mother'>,
<class '__main__.Father'>, <class '__main__.Human'>,
<class 'object'>)
먼저 출력된 값일수록 우선순위가 높습니다.
위의 예제에서, Son -> Mother -> Father -> Human -> 그리고 최상위 부모인 object 클래스 순서로 우선순위를 가지는 것을 확인할 수 있습니다.
다중 상속시 초기화 순서
파이썬에서 다중상속 시 두 부모 클래스의 __init__ 메서드를 모두 호출하는 방법을 알려드리겠습니다.
다중상속에서 부모 클래스의 __init__ 메서드를 모두 호출하는 방법은 크게 두 가지가 있습니다:
- 각 부모 클래스의
__init__메서드를 직접 호출하는 방법 -
super()함수를 사용하는 방법 (메서드 결정 순서(MRO) 활용)
아래에 간단한 예제 코드를 보여드리겠습니다:
class A:
def __init__(self, a_param):
print("A 초기화")
self.a_param = a_param
class B:
def __init__(self, b_param):
print("B 초기화")
self.b_param = b_param
# 방법 1: 직접 호출 방식
class C(A, B):
def __init__(self, a_param, b_param, c_param):
A.__init__(self, a_param) # A의 __init__ 호출
B.__init__(self, b_param) # B의 __init__ 호출
self.c_param = c_param
# 방법 2: super() 함수 사용
class D(A, B):
def __init__(self, a_param, b_param, d_param):
super().__init__(a_param) # MRO에 따라 A의 __init__ 호출
B.__init__(self, b_param) # B의 __init__은 수동으로 호출
self.d_param = d_param
super() 함수를 사용할 때 주의할 점은 파이썬의 메서드 결정 순서(MRO)를 따른다는 것입니다. 위 예제에서 D 클래스의 MRO는 D -> A -> B -> object 순서이므로 super().__init__()은 A.__init__()을 호출합니다.
다중상속에서 모든 부모 클래스의 __init__을 호출하려면 다음과 같은 패턴이 가장 흔하게 사용됩니다:
class Child(A, B):
def __init__(self, a_param, b_param, child_param):
A.__init__(self, a_param) # A의 초기화
B.__init__(self, b_param) # B의 초기화
self.child_param = child_param # 자식 클래스의 추가 초기화
이 방법은 명시적이고, 어떤 부모 클래스의 초기화 메서드가 호출되는지 코드에서 명확하게 보입니다.