Python строит MRO алгоритмом C3, сохраняя порядок родителей и согласованность их собственных порядков. TypeError возникает, когда эти требования противоречат друг другу и единую последовательность построить нельзя.
Как устроен механизм разрешения методов (MRO) при множественном наследовании в Python — алгоритм C3-линеаризации? В каком случае интерпретатор выбросит ошибку TypeError: Cannot create a consistent method resolution order?
Python строит MRO алгоритмом C3, сохраняя порядок родителей и согласованность их собственных порядков. TypeError возникает, когда эти требования противоречат друг другу и единую последовательность построить нельзя.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Python строит MRO алгоритмом C3, сохраняя порядок родителей и согласованность их собственных порядков. TypeError возникает, когда эти требования противоречат друг другу и единую последовательность построить нельзя.
Например:
class X: pass
class Y: pass
class A(X, Y): pass
class B(Y, X): pass
# class C(A, B): pass # TypeError: contradictory order
A требует X раньше Y, а B — наоборот. В C совместить требования невозможно. super() следует по MRO, а не обязательно обращается к непосредственному родителю из текста. Для существующего класса порядок можно посмотреть через mro или mro().