Абстрактные модели Django против простых микшинов Python против азбуки Python - PullRequest
9 голосов
/ 16 июля 2010

Это вопрос, вызванный другим вопросом от меня.

Django предоставляет Абстрактные базовые классы функциональность (которые не совпадают с ABC-классами в Python?), чтобы можно было создать Модель (модели Джанго. Модель), от которой можно наследовать, но без этой Модели, имеющей фактическую таблицу в базе данных.Можно запустить это поведение, установив атрибут «abstract» в мета-классе модели.

Теперь вопрос: почему Django решает это таким образом?Зачем нужна такая особая модель «Абстрактный базовый класс»?Почему бы не смешивать модель, просто наследуя ее от класса объекта и смешивая ее с существующей моделью?Или это также может быть заданием для азбуки Python?(заметьте, я не очень знаком с ABC-классами в Python, мое невежество может показать здесь)

Ответы [ 2 ]

13 голосов
/ 16 июля 2010

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

ABC отсутствуют, потому что они были введены только в Python 2.6, и разработчики Django имеют план действий для поддержки версий Python (поддержка 2.3 была прекращена только в 1.2).

Что касается объектно-наследуемых миксинов, они будут менее Pythonic во многих отношениях, чем просто снижение читабельности. Django использует метакласс ModelBase для Model объектов, который фактически анализирует определенные свойства модели при инициализации и заполняет Model._meta полями, Meta параметрами и другими свойствами. Имеет смысл повторно использовать эту структуру для обоих типов моделей. Это также позволяет Django предотвращать переопределение полей абстрактной модели путем наследования моделей.

Есть еще много причин, по которым я могу придумать, все они незначительны сами по себе, но они суммируют, чтобы сделать текущую реализацию гораздо более Pythonic. Хотя нет ничего плохого в том, чтобы использовать объектно-наследуемые миксины.

7 голосов
/ 16 июля 2010

Одна из причин - способ определения полей в модели.

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

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