C3 строит единый MRO, сохраняя порядок родителей и согласованность их собственных порядков. Конфликт возникает, когда требования несовместимы, например один путь требует A раньше B, а другой — B раньше A.
Как работает C3-линеаризация при множественном наследовании и когда возникает коллизия MRO?
C3 строит единый MRO, сохраняя порядок родителей и согласованность их собственных порядков. Конфликт возникает, когда требования несовместимы, например один путь требует A раньше B, а другой — B раньше A.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
C3 строит единый MRO, сохраняя порядок родителей и согласованность их собственных порядков. Конфликт возникает, когда требования несовместимы, например один путь требует A раньше B, а другой — B раньше A.
Алгоритм объединяет линеаризации родителей и список самих родителей. На каждом шаге выбирает голову списка, которой нет в хвостах остальных; если подходящей головы нет, создать класс нельзя. Python выдаёт TypeError при определении такого класса. super() следует полученному MRO, а не просто вызывает «непосредственного родителя». Порядок можно посмотреть через Class.__mro__, не угадывая его по картинке наследования.
Источник: github.com.