Порядок поиска — 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.