MRO — это алгоритм в Python, который определяет порядок поиска атрибутов и методов при наследовании классов. Это особенно важно при множественном наследовании, когда один класс наследуется от нескольких родительских классов.
Python использует алгоритм C3 linearization для построения MRO. Этот алгоритм гарантирует, что:
Посмотреть MRO класса можно через атрибут __mro__
или метод mro()
:
class A:
pass
class B(A):
pass
class C(A):
pass
class D(B, C):
pass
print(D.__mro__)
# Выведет: (<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)
Рассмотрим классическую проблему множественного наследования:
class A:
def method(self):
print("A")
class B(A):
def method(self):
print("B")
super().method()
class C(A):
def method(self):
print("C")
super().method()
class D(B, C):
def method(self):
print("D")
super().method()
d = D()
d.method()
# Вывод:
# D
# B
# C
# A
Благодаря MRO вызовы идут в порядке: D → B → C → A
Python выдаст ошибку, если не сможет построить непротиворечивый MRO:
class A:
pass
class B(A):
pass
class C(A, B): # TypeError: Cannot create a consistent method resolution
pass # order (MRO) for bases A, B
class A:
def method(self):
print("A")
class B(A):
def method(self):
print("B")
super().method() # Следующий класс в MRO
class C(A):
def method(self):
print("C")
super().method()
class D(B, C):
pass
d = D()
d.method() # Выведет B → C → A
__mro__
или метод mro()
super()
полагается на MRO для определения следующего класса в цепочке вызововПонимание MRO критически важно для работы с сложными иерархиями классов в Python и помогает избежать тонких багов при множественном наследовании.