Короткий ответ
MRO (Method Resolution Order) — порядок, в котором Python обходит классы при поиске метода или атрибута, особенно когда в иерархии несколько уровней или родителей. Интерпретатор просматривает классы строго в этом порядке и использует первое найденное определение.
Как это работает подробнее
- Просмотр порядка. Посмотреть последовательность для конкретного класса можно методом
mro()или атрибутом__mro__. - Алгоритм C3. В классах нового стиля порядок строится по C3-линеаризации, которая обходит иерархию в ширину и не даёт классу появиться раньше своих родителей.
- Связь с super().
super()вызывает следующий класс согласно MRO относительно точки вызова, поэтому предсказать поведение без знания порядка нельзя. - Значимость. Понимание MRO критично при множественном наследовании, когда нужно определить, какой из одноимённых методов будет выполнен.
Пример кода
Вывод порядка разрешения методов
class A:
pass
class B(A):
pass
class C(B):
pass
print(C.mro())
# [<class '__main__.C'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>]Что использовать на практике
- Диагностика. При сомнениях выводи
Класс.mro()и проверяй, какая реализация метода будет вызвана. - Проектирование. Осознанно выбирай порядок родителей в объявлении класса: он напрямую влияет на MRO.
- Кооперативный вызов. Для вызова методов вдоль цепочки наследования используй
super(), а не прямое обращение к конкретному родителю.