Короткий ответ
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(), а не прямое обращение к конкретному родителю.
Подводные камни
- Интуиция против MRO. Ожидаемый «естественный» порядок часто расходится с реальным, особенно в ромбовидных иерархиях.
- Ошибка линеаризации. При противоречивой структуре наследования Python не сможет построить MRO и выбросит исключение.
- Перестановка родителей. Смена порядка базовых классов меняет порядок поиска и, как следствие, результат вызова одноимённого метода.
Как отвечать на собеседовании
- Дай определение MRO как порядка поиска методов при наследовании → покажи, как посмотреть его через
mro()или__mro__→ упомяни C3-линеаризацию и связь сsuper()→ приведи простой пример иерархии с выводом порядка.