Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬 다중 상속 클래스에서 클래스 변수는 어떻게 작동할까? MRO 탐색 순서 완벽 정리

파이썬에서는 하나의 클래스가 둘 이상의 부모(기반) 클래스로부터 파생될 수 있습니다. 이를 다중 상속(Multiple Inheritance)이라고 부릅니다.

다중 상속의 기본 개념

다중 상속을 사용하면 모든 부모 클래스의 기능과 특성이 자식(파생) 클래스에 그대로 물려받아집니다. 문법 역시 단일 상속과 거의 동일해서, 괄호 안에 여러 부모 클래스를 쉼표로 나열해 주기만 하면 됩니다.

class Super1:
    pass

class Super2:
    pass

class MultiDerived(Super1, Super2):
    pass

클래스 변수와 속성의 탐색 순서

그렇다면 다중 상속 상황에서 클래스 변수나 메서드 같은 속성은 어떤 순서로 찾아질까요? 파이썬은 지정된 속성을 먼저 현재 클래스 내부에서 검색합니다. 현재 클래스에서 찾지 못하면 부모 클래스들로 탐색 범위를 넓히는데, 이때 깊이 우선(depth-first), 왼쪽에서 오른쪽(left-to-right) 방식으로 진행되며 한 번 검색한 클래스는 다시 검색하지 않습니다.

따라서 위 예제의 MultiDerived 클래스에서 속성을 찾는 순서는 다음과 같습니다.

[MultiDerived → Super1 → Super2 → object]

MRO(Method Resolution Order)란?

위에서 확인한 탐색 순서를 MultiDerived 클래스의 선형화(linearization)라고 부르며, 이 순서를 결정하는 규칙의 집합을 MRO(Method Resolution Order, 메서드 해석 순서)라고 합니다.

MRO는 두 가지 중요한 원칙을 보장합니다.

  • 자식 클래스는 항상 부모 클래스보다 먼저 조회됩니다.
  • 부모 클래스가 여러 개일 경우, 탐색 순서는 기반 클래스 튜플에 나열된 순서를 따릅니다.

MRO 확인 방법

특정 클래스의 MRO는 두 가지 방법으로 확인할 수 있습니다. __mro__ 속성은 튜플(tuple)을 반환하고, mro() 메서드는 리스트(list)를 반환한다는 차이가 있습니다.

>>> MultiDerived.mro()
[<class '__main__.MultiDerived'>,
 <class '__main__.Super1'>,
 <class '__main__.Super2'>,
 <class 'object'>]

이처럼 MRO를 정확히 이해하고 있으면, 다중 상속 구조에서 클래스 변수나 메서드가 실제로 어느 클래스에서 가져와지는지 명확하게 예측할 수 있으며, 복잡한 상속 계층에서 발생할 수 있는 이름 충돌 문제도 효과적으로 피할 수 있습니다.