Назад к вопросам
Middle
135
questionbank

Что такое MRO (метод разрешения порядка)?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

MRO определяет порядок, в котором Python ищет методы и атрибуты в иерархии наследования классов.

В Python 3 используется C3 Superclass Linearization Algorithm для определения MRO.

  • При одиночном наследовании: Порядок прост - сначала текущий класс, затем его родитель, затем родитель родителя и так далее.
  • При множественном наследовании: C3 алгоритм обеспечивает монотонность (порядок родительских классов не меняется по отношению друг к другу) и локальную однородность (порядок класса и его непосредственных предков сохраняется).

MRO можно посмотреть с помощью:

  • Атрибута __mro__: кортеж классов в порядке разрешения.
  • Метода mro(): возвращает список классов в порядке разрешения.
  • Функции help(): выводит MRO в информации о классе.

Пример:

class A:
    def method(self):
        print("Метод из A")

class B(A):
    def method(self):
        print("Метод из B")

class C(A):
    def method(self):
        print("Метод из C")

class D(B, C):
    pass

# D.__mro__
# Out: (<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)

# d = D()
# d.method()
# Out: Метод из B 

В данном примере MRO для класса D — D -> B -> C -> A -> object. При вызове d.method(), Python сначала ищет его в D (нет), затем в B (есть), и выполняет метод из B.

Понимание MRO критически важно при работе с множественным наследованием для предсказания поведения кода.