Вопрос проверяет понимание порядка разрешения методов при множественном наследовании и умение быстро диагностировать, откуда берется метод.
MRO (Method Resolution Order) — это порядок, в котором Python ищет атрибуты и методы по цепочке наследования.
Посмотреть MRO можно через ClassName.mro() или ClassName.__mro__.
Также помогает help(ClassName), там MRO обычно показан.
Это особенно важно при множественном наследовании, чтобы понимать, какой метод будет вызван.
MRO нужен, чтобы предсказуемо понять: какая реализация метода будет выбрана.
MRO — порядок обхода базовых классов при поиске атрибута/метода (используется, например, при вызове
obj.method()).
Метод класса:
MyClass.mro()
Атрибут класса (кортеж классов):
MyClass.__mro__
Встроенная документация:
help(MyClass) # покажет MRO в выводе
class A:
def f(self): return "A"
class B(A):
def f(self): return "B"
class C(A):
def f(self): return "C"
class D(B, C):
pass
print([cls.__name__ for cls in D.mro()]) # ['D', 'B', 'C', 'A', 'object']
print(D().f()) # 'B' (берётся из B, потому что B раньше в MRO)
Разбор багов в множественном наследовании
Понимание, как работает super() (он идёт по MRO, а не “в родителя один шаг”)
Предсказуемое переопределение методов в миксинах
Смотреть MRO — быстрый способ понять, “почему вызывается именно этот метод”, особенно когда наследование сложное.