Определение метода в иерархии классов с ромбовидным наследованием

Порядок поиска — D, B, C, A, object. Если method не определён ни в одном из них, как в показанном фрагменте, обращение вызовет AttributeError.

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

Что ответить на собеседовании

Порядок поиска — D, B, C, A, object. Если method не определён ни в одном из них, как в показанном фрагменте, обращение вызовет AttributeError.

Подробный разбор

Ответ с пояснениями

Условие

Как Python будет искать реализацию метода method для экземпляра класса, учитывая следующую схему наследования:

class A:
    ...

class B(A):
    ...

class C(A):
    ...

class D(B, C):
    ...

obj = D()
obj.method

Ответ

Порядок поиска — D, B, C, A, object. Если method не определён ни в одном из них, как в показанном фрагменте, обращение вызовет AttributeError.

Python использует C3-линеаризацию, сохраняя согласованный порядок базовых классов и не посещая общий предок дважды.

D.__mro__  # (D, B, C, A, object)

Если B и C оба определяют method, будет выбран метод B. Если в B метода нет, а в C и A есть, выберется C, хотя A является родителем B: поиск идёт по общей MRO, а не рекурсивно до конца первой ветви.

obj.method только получает атрибут; для вызова нужны скобки. Кооперативный super() продолжает поиск по этой же MRO.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее