Множественное наследование и MRO — в каком порядке Python ищет методы?
Есть класс, который наследуется сразу от двух. У обоих родителей есть метод с одинаковым именем. Какой вызовется? И что вообще такое этот MRO, про который все говорят?
3 ответа
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, а не «прямо к родителю».
Слева направо по родителям, наследник раньше предка. Смотри Класс.__mro__ — там точный порядок поиска.
Левого родителя.