Python MRO란?
Techchallengearena
Python을 사용하다보면 자연스럽게 클래스 상속 구조를 사용하곤 합니다. 파이썬은 다중 상속을 지원하는데, 다중 상속을 할 때 여러 클래스가 동일한 함수를 구현할 경우 혼선이 발생할 수 있습니다. 그래서 Python은 내부적으로 MRO(Method Resolution Order)를 관리합니다.
1/ Python에서 클래스를 만들면, __bases__
라는 변수에 현재 클래스부터 object 까지 일정한 순서를 저장합니다. 순서는 상속 관계에 따라서 자동으로 형성됩니다.
2/ Python은 내부적으로 C3 Linearization 알고리즘을 사용하여 MRO를 생성합니다. C3 Linearization은 Topology Sort와 유사하게, 상속 관계에서 의존성이 없는 순서대로 순차적으로 클래스를 나열하는 알고리즘입니다. MRO를 구할때는 부모의 MRO를 먼저 구한 후에, 현재 클래스의 MRO를 위해 머지(Merge)합니다. 원칙은 먼저 나온 클래스 중 의존성이 없는 것부터 순차적으로 나열하는 것입니다.
3/ 이렇게 결정된 순서는 __bases__
에 저장되고, 인스턴스 매서드에 실제 매핑되는 함수를 결정할 때 주요한 판단 기준이 됩니다. 먼저, Python은 MRO를 순서대로 찾으면서 매서드 이름이 클래스의 __dict__
에 존재하는지 확인합니다. 가장 먼저 매칭되는 함수가 인스턴스 매서드에 매핑됩니다.
4/ MRO는 먼저 상속한 부모 클래스를 우선적으로 적용하기 때문에, 반드시 순서에 주의해야 합니다. Mixin 클래스와 같이 여러 곳에서 사용하고자 하는 기능을 모아놓은 부모 클래스가 있다면, 다른 클래스로 인해서 구현이 달라지지 않도록 제일 먼저 상속하는게 좋습니다.
5/ super() 함수는 기본적으로 현재 클래스의 MRO 중 현재 클래스 이후 나오는 클래스 중 하나가 매칭됩니다. 만약 super(type, obj)
를 사용하면 obj의 MRO 중 type 이후에 나오는 클래스 중 하나가 매칭됩니다.
알고리즘 구현에 대한 자세한 내용은 블로그에 담았습니다! 글이 유익하셨다면 많은 구독 부탁드립니다!
https://blog.techchallengearena.com/p/python-mro
#python #oop #super
다음 내용이 궁금하다면?
이미 회원이신가요?
2024년 6월 23일 오후 1:00
•
조회 1,209