Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Python: mro

По какому алгоритму Python ищет методы при множественном наследовании?

Вопрос проверяет знание внутреннего механизма разрешения методов и умение анализировать сложные иерархии классов.

Короткий ответ

Python использует алгоритм C3 Linearization. Он формирует линейный порядок обхода классов, называемый MRO (Method Resolution Order). Методы ищутся строго в этом порядке. Это гарантирует предсказуемость и согласованность иерархии наследования.

Длинный ответ

Определение

MRO (Method Resolution Order) — это порядок, в котором Python ищет атрибуты и методы класса при обращении к ним.

Python вычисляет MRO с помощью алгоритма C3 Linearization.

Зачем нужен C3

Алгоритм решает несколько проблем:

  1. Избегает дублирования классов

  2. Сохраняет локальный порядок наследования

  3. Делает результат детерминированным

Простой пример

class A:
    def method(self):
        print("A")

class B(A):
    pass

class C(A):
    pass

class D(B, C):
    pass

Порядок поиска методов:

D.mro()

Результат (логически):

  1. D

  2. B

  3. C

  4. A

  5. object

Когда вызывается D().method(), Python идёт строго по этому списку.


Как работает поиск метода

Алгоритм:

  1. Берёт класс объекта

  2. Проверяет его

  3. Идёт по MRO сверху вниз

  4. Берёт первый найденный метод

Это означает:

  • метод выбирается один

  • «алмазное наследование» обрабатывается корректно


Почему это важно на практике

Непонимание MRO приводит к:

  • неожиданным вызовам методов

  • ошибкам при использовании super()

  • трудноотлавливаемым багам

Пример с super():

class A:
    def action(self):
        print("A")

class B(A):
    def action(self):
        super().action()
        print("B")

super() всегда следует MRO, а не «родителю напрямую».


Краткий вывод

Python ищет методы по MRO, вычисленному алгоритмом C3. Это делает множественное наследование предсказуемым, но требует осознанного проектирования иерархий.

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    5

  • Сложность:

    7

Навыки

  • Python

    Python

Ключевые слова

#mro

Подпишись на Python Developer в телеграм

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.