← Все вопросы

Множественное наследование и MRO — в каком порядке Python ищет методы?

Задан 8 месяцев назад542 просмотров3 ответа
18

Есть класс, который наследуется сразу от двух. У обоих родителей есть метод с одинаковым именем. Какой вызовется? И что вообще такое этот MRO, про который все говорят?

3 ответа

26

MRO (Method Resolution Order) — это порядок, в котором Python ищет метод по цепочке классов. При class C(A, B) сначала смотрят в самом C, потом в A, потом в B, потом в общих предках. Победит метод того класса, который встретится раньше:

class A:
    def hello(self): print('A')

class B:
    def hello(self): print('B')

class C(A, B):
    pass

C().hello()        # A  (A раньше B в списке родителей)
print(C.__mro__)   # (C, A, B, object)

Порядок можно посмотреть через C.__mro__ или C.mro(). Python строит его по алгоритму C3-линеаризации — он гарантирует, что наследник всегда раньше родителя, а порядок родителей в скобках сохраняется. Практический вывод: класс, указанный левее в скобках, имеет приоритет. И именно поэтому super() ходит по MRO, а не «прямо к родителю».

Руслан Петров C3-линеаризация звучит страшно, но на практике "левый родитель главнее" покрывает 90% случаев · 8 месяцев назад
Pavel Klochkov __mro__ — лучший способ просто посмотреть и не гадать · 7 месяцев назад
9

Слева направо по родителям, наследник раньше предка. Смотри Класс.__mro__ — там точный порядок поиска.

3

Левого родителя.

Ваш ответ

Войдите, чтобы ответить на вопрос.
Поддержать проект