问题的起源我最近正在使用 django,并且习惯了模型、序列化器和表单中的 Meta 类。
到目前为止我的理解 我了解到元类用于创建类。
当定义一个类时,Python将进入该类并收集所有属性和方法并存储为字典,然后搜索
__metaclass__
属性。如果已定义,它将使用该类来创建定义的类,否则它将使用默认对象。
Object 是默认类,所有类都继承该类,并且该对象类必须有 __metaclass__
,即默认类型。
__new__
和 __init__
方法用于创建类。
例如
class Transformer(models.Model):
name = models.CharField(max_length=150, unique=True)
class Meta:
ordering = ('name',)
何时何地使用这个Meta类?
编辑1:
清除了 metaclasses 和 django Meta 不同的一件事。
所以 Meta 只是 Transformer 模型类的嵌套类。
问题:我的问题仍然是模型类如何使用这个Meta类?
正如评论中所说:Python 元类与 django 元类不同:Django 只是出于历史原因,对内部类使用相同的术语,其中注释了有关类的额外参数,而外部类的主要成员则意味着对应于模型或表单中的字段。
另一方面,Python 元类是您在示例中描述的内容,尽管您已经检查了一些 Python 2 文档。在当前的 Python 中,元类是通过在新类的声明中传递关键字参数“metaclas=”来确定的,其中基类位于:
class MyClass(Base1, Base2, metaclass=MyMeta):
...
据我所知,Django 行为的起源是 Django 的早期版本实际上使用自定义(Python)元类来注释现在在嵌套中使用的一些参数
Meta
- 在这样做时,它需要在类主体内内联定义元类的快捷方式:它不会像正常使用时那样将 __metaclass__
名称分配给外部定义的元类,而是就地定义类:从语言运行时的角度来看,它会找到绑定到有效元类的名称 __metaclass__
并使用它来构建类。
后来的版本,甚至在 Python 2 中,修改了这种方法 - 内部类不再是模型或表单的实际“元类”(因为以前的方法显然是多余的)。
Model Meta 基本上是模型类的内部类。模型元基本上用于更改模型字段的行为,例如更改订单选项、verbose_name_plural 和许多其他选项。向模型中添加元类是完全可选的。
示例:
class Category (models.Model):
name = models.CharField(max_length=255)
slug = models.SlugField(max_length=255, unique=True)
def __str__(self):
return self.name
class Meta:
verbose_name_plural= 'Categories'