Я использую Django, который позволяет людям добавлять дополнительные параметры в класс с помощью class Meta
.
class FooModel(models.Model):
...
class Meta:
...
Единственное, что я нашел в документации Python, было:
class FooMetaClass(type):
...
class FooClass:
__metaclass__ = FooMetaClass
Однако я не думаю, что это одно и то же.
Ответы:
Вы задаете вопрос о двух разных вещах:
Meta
внутренний класс в моделях Django :Это просто контейнер класса с некоторыми опциями (метаданными), прикрепленными к модели. Он определяет такие вещи, как доступные разрешения, имя связанной таблицы базы данных, является ли модель абстрактной или нет, единственная и множественная версии имени и т. Д.
Краткое объяснение здесь: Django docs: Модели: мета-опции
Список доступных мета-опций находится здесь: Django docs: Model Meta options
Для последней версии Django: Django docs: Параметры модели Meta
Метакласс в Python :
Лучшее описание здесь: что такое метаклассы в Python?
источник
Meta
внутренний класс Django мешает вам использовать встроенные в Python функции метакласса?Продолжая ответ Тадека на Django выше, использование 'class Meta:' в Django также является обычным Python.
Внутренний класс является удобным пространством имен для общих данных между экземплярами класса (отсюда и название Meta для «метаданных», но вы можете называть его как угодно). В то время как в Django это, как правило, конфигурация, предназначенная только для чтения, ничто не помешает вам ее изменить:
Вы также можете изучить его непосредственно в Django, например:
Однако в Django вы, скорее всего, захотите изучить
_meta
атрибут, который являетсяOptions
объектом, созданным модельюmetaclass
при ее создании. Здесь вы найдете всю «мета» информацию класса Django. В DjangoMeta
просто используется для передачи информации в процесс создания_meta
Options
объекта.источник
MyUser.objects.get(pk=1)._meta
type(MyUser.objects.get(pk=1)).Meta
Model
Класс Django специально обрабатывает наличие атрибута с именем,Meta
который является классом. Это не общая вещь Python.Метаклассы Python совершенно разные.
источник
Meta
работает класс? Я полагаю, что ОП спросил об этом конкретно.Ответы, которые утверждают, что модели
Meta
и метаклассы Django «абсолютно разные», вводят в заблуждение.Построение модели Джанго объектов класса (то есть объект, который обозначает само определение класса; да, классы также являются объектами) действительно управляется метаклассом, который называется
ModelBase
, вы можете увидеть этот код здесь:https://github.com/django/django/blob/master/django/db/models/base.py#L61
И одна из вещей, которые
ModelBase
делает, - это создание_meta
атрибута в каждой модели Django, который содержит механизм проверки, подробности поля, логику сохранения и так далее. Во время этой операции материал, указанный во внутреннемMeta
классе модели, читается и используется в этом процессе.Итак, хотя да, в некотором смысле
Meta
метаклассы - это разные «вещи», в механике построения модели Джанго они тесно связаны; понимание того, как они работают вместе, углубит ваше понимание обоих.Это может быть полезным источником информации, чтобы лучше понять, как модели Django используют метаклассы.
https://code.djangoproject.com/wiki/DevModelCreation
И это также может помочь, если вы хотите лучше понять, как работают объекты в целом.
https://docs.python.org/3/reference/datamodel.html
источник
Документ внутреннего мета-класса Этот документ метаданных модели django представляет собой «все, что не является полем», такое как параметры упорядочения (упорядочение), имя таблицы базы данных (db_table) или удобочитаемые имена единственного и множественного числа (verbose_name и verbose_name_plural). Ничего не требуется, и добавление класса Meta к модели совершенно необязательно. https://docs.djangoproject.com/en/dev/topics/db/models/#meta-options
источник
В Django он действует как класс конфигурации и хранит данные конфигурации в одном месте!
источник