Что такое MRO (Method Resolution Order) в Python

Ответ

MRO (Method Resolution Order) — это алгоритм, который определяет порядок поиска методов и атрибутов в иерархии классов при множественном наследовании в Python. Он создает предсказуемую, линеаризованную последовательность всех базовых классов.

Python использует алгоритм C3-линеаризации для построения MRO. Он гарантирует, что:

  • Дочерний класс всегда проверяется раньше родительского.
  • Если класс наследуется от нескольких родителей, их относительный порядок сохраняется.

Зачем это нужно? MRO решает проблему "алмаза" (diamond problem) и вносит ясность в сложных иерархиях наследования, делая поведение кода детерминированным.

Пример:

class A:
    def who_am_i(self):
        print("I am A")

class B(A):
    def who_am_i(self):
        print("I am B")

class C(A):
    def who_am_i(self):
        print("I am C")

# Порядок (B, C) важен при наследовании
class D(B, C):
    pass

d_instance = D()
d_instance.who_am_i() # Вывод: I am B

# Просмотр MRO для класса D
print(D.mro())
# Вывод:
# [<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>]

Как видно из вывода D.mro(), Python сначала ищет метод в D, затем в B, затем в C и только потом в их общем предке A. Если Python не может построить согласованный MRO (например, из-за циклической зависимости), он вызовет исключение TypeError.