Ответ
MRO (Method Resolution Order) — это алгоритм, который определяет порядок поиска методов и атрибутов в иерархии классов при множественном наследовании в Python. Он создает предсказуемую, линеаризованную последовательность всех базовых классов.
Python использует алгоритм C3-линеаризации для построения MRO. Он гарантирует, что:
- Дочерний класс всегда проверяется раньше родительского.
- Если класс наследуется от нескольких родителей, их относительный порядок сохраняется.
Зачем это нужно? MRO решает проблему "алмаза" (diamond problem) и вносит ясность в сложных иерархиях наследования, делая поведение кода детерминированным.
Пример:
class A:
def who_am_i(self):
print("I am A")
class B(A):
def who_am_i(self):
print("I am B")
class C(A):
def who_am_i(self):
print("I am C")
# Порядок (B, C) важен при наследовании
class D(B, C):
pass
d_instance = D()
d_instance.who_am_i() # Вывод: I am B
# Просмотр MRO для класса D
print(D.mro())
# Вывод:
# [<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>]
Как видно из вывода D.mro()
, Python сначала ищет метод в D
, затем в B
, затем в C
и только потом в их общем предке A
. Если Python не может построить согласованный MRO (например, из-за циклической зависимости), он вызовет исключение TypeError
.