Общие советы для слегка уточненного вопроса:
Нетривиальное множественное наследование в Python требует, чтобы Advanced Techniques имели дело с конфликтом метакласса / метатипа. Посмотрите этот рецепт из архивов ActiveState и посмотрите, как он выглядит:
Выписка из связанного рецепта:
Самый простой случай, когда метатип
Конфликт бывает следующий.
Рассмотрим класс A с метаклассом M_A
и класс B с независимым
метакласс M_B
; предположим, что мы выводим C
от А и Б. Вопрос: что такое
метакласс C? Это M_A
или M_B
Правильный ответ (см. Книгу
«Положить метаклассы на работу» для
вдумчивое обсуждение) это M_C
, где
M_C
- это метакласс, который наследуется от
M_A
и M_B
.
Тем не менее, Python не та магия, и
он не создает автоматически M_C
.
Вместо этого он вызывает ошибку TypeError,
предупреждение программиста о возможном
спутанность сознания.
Следовательно, я рекомендую ограничить использование множественного наследования в Python в следующих случаях:
- Вы должны это сделать, потому что ваш проблемный домен требует объединения двух отдельно поддерживаемых библиотек с одним наследованием.
- Вы достигли такой беглости с метатипом и метаклассом, что можете написать рецепт 204197 или его эквивалент так же легко и уверенно, как вы можете написать оператор печати.
Edit:
Вот Гидо ван Россум в Введение в Python :
Понятно, что неизбирательное использование
множественное наследование является обслуживанием
кошмар, учитывая опору в
Python на соглашениях, чтобы избежать
случайные конфликты имен.
Здесь он снова в PEP 253 , который описывает идеи, которые были включены в Python, но не реализацию:
Метатипы определяют различные политики
для типов, таких как что
происходит, когда тип вызывается, как динамические типы (будь
тип dict может быть изменен после его создания), что
порядок разрешения метода: как выглядят атрибуты экземпляра
и т. д.
Я буду утверждать, что глубина слева направо не самая лучшая
решение, когда вы хотите получить максимальную пользу от нескольких
наследование.
Я буду утверждать, что при множественном наследовании метатип
подтип должен быть потомком метатипов всех базовых типов.
Это не означает, что вы не должны использовать множественное наследование; Я просто предупреждаю вас, чтобы однажды вы не удивились, обнаружив, что хлопаете себя по лбу и восклицаете: «О!
Метатип одного из моих подтипов не является потомком метатипов всех его базовых типов! Разве ты не ненавидишь, когда это происходит? "