Будет ли извлечение метаданных страницы хорошо использовать множественное наследование? - PullRequest
1 голос
/ 18 июня 2009

Мне было интересно, есть ли у меня пара моделей, в обе из которых входят такие поля, как "meta_keywords" или "slug", которые имеют отношение к веб-странице, на которой будет отображаться экземпляр модели, и целесообразно ли разбивать эту страницу. элементы метаданных в их собственный класс, скажем, PageMeta, и другие мои модели подклассируют их через множественное наследование?

1 Ответ

0 голосов
/ 18 июня 2009

Общие советы для слегка уточненного вопроса:

Нетривиальное множественное наследование в 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 в следующих случаях:

  1. Вы должны это сделать, потому что ваш проблемный домен требует объединения двух отдельно поддерживаемых библиотек с одним наследованием.
  2. Вы достигли такой беглости с метатипом и метаклассом, что можете написать рецепт 204197 или его эквивалент так же легко и уверенно, как вы можете написать оператор печати.

Edit:

Вот Гидо ван Россум в Введение в Python :

Понятно, что неизбирательное использование множественное наследование является обслуживанием кошмар, учитывая опору в Python на соглашениях, чтобы избежать случайные конфликты имен.

Здесь он снова в PEP 253 , который описывает идеи, которые были включены в Python, но не реализацию:

Метатипы определяют различные политики для типов, таких как что происходит, когда тип вызывается, как динамические типы (будь тип dict может быть изменен после его создания), что порядок разрешения метода: как выглядят атрибуты экземпляра и т. д.

Я буду утверждать, что глубина слева направо не самая лучшая решение, когда вы хотите получить максимальную пользу от нескольких наследование.

Я буду утверждать, что при множественном наследовании метатип подтип должен быть потомком метатипов всех базовых типов.

Это не означает, что вы не должны использовать множественное наследование; Я просто предупреждаю вас, чтобы однажды вы не удивились, обнаружив, что хлопаете себя по лбу и восклицаете: «О! Метатип одного из моих подтипов не является потомком метатипов всех его базовых типов! Разве ты не ненавидишь, когда это происходит? "

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...