이 글은 파이썬의 MRO 기능에 대해 공부하기 위해 레퍼런스를 참고해 정리한 글입니다.
MRO(Method Resolution Order)
메서드 해결(결정) 순서라고 직역할 수 있겠다.
MRO를 이해하기 전 먼저 파이썬은 다중 상속을 지원한다.
두 개의 부모 클래스(A,B)를 상속받은 자식 클래스(C)가 있다고 가정하자
A,B에 같은 이름의 메서드가 정의되어 있고 C에서 이 메서드를 호출하면
지옥의 다이아몬드라는 상속 문제가 발생한다.
A와 B 중 어떤 클래스의 메서드를 실행해야 할 지 결정하지 못하는 것이다.
파이썬은 이 문제를 MRO로 해결한다.
MRO는 자식과 부모 클래스를 전부 포함하여 메서드의 실행 순서를 정해두는 것이다.
(메서드 탐색 순서로 이해해도 좋을 것 같다)
MRO는 __mro__ 속성을 통해 확인할 수 있다.
우선 순위는 아래와 같다.
1. 자식 클래스
2. 부모 클래스(먼저 상속 받을수록 우선 순위 높음)
3. 부모 클래스의 부모 클래스(존재하는 경우)
4.object 클래스(최상위)
만약 MRO를 결정할 수 없는 경우
파이썬은 Cannot create consistent method ordering이라는 MRO 오류를 낸다.
첫 번째는 3번째 우선순위에 해당하는 A를 D가 상속함으로써
2번째 우선순위로 올라와서 A,B,C가 다 같은 우선 순위가 된 경우이다.
이렇게 되면 D 입장에서 A는
2번째 우선 순위가 될 수도 있고 3번째 우선 순위가 될 수도 있어서
MRO를 결정할 수 없게 된다.
두 번째는 C와 D가 각각 같은 클래스를 다른 순서로 상속받는 경우이다.
이렇게 되면 MRO는 상속 받은 순서대로 작성해야 하는데
상속 순서가 일관되지 않으므로 오류가 발생한다.
이런 식으로 MRO 오류는 클래스들의 상속 구조를 파악해서 해결할 수 있겠다.
레퍼런스
https://tibetsandfox.tistory.com/26