元类在Python中如何工作?

问题描述 投票:0回答:2

问题的起源我最近正在使用 django,并且习惯了模型、序列化器和表单中的 Meta 类。

到目前为止我的理解 我了解到元类用于创建类。

当定义一个类时,Python将进入该类并收集所有属性和方法并存储为字典,然后搜索

__metaclass__
属性。如果已定义,它将使用该类来创建定义的类,否则它将使用默认对象。 Object 是默认类,所有类都继承该类,并且该对象类必须有
__metaclass__
,即默认类型。

type 类有
__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 class django-rest-framework metaclass
2个回答
1
投票

正如评论中所说:Python 元类与 django 元类不同:Django 只是出于历史原因,对内部类使用相同的术语,其中注释了有关类的额外参数,而外部类的主要成员则意味着对应于模型或表单中的字段。

另一方面,Python 元类是您在示例中描述的内容,尽管您已经检查了一些 Python 2 文档。在当前的 Python 中,元类是通过在新类的声明中传递关键字参数“metaclas=”来确定的,其中基类位于:

class MyClass(Base1, Base2, metaclass=MyMeta):
   ...

据我所知,Django 行为的起源是 Django 的早期版本实际上使用自定义(Python)元类来注释现在在嵌套中使用的一些参数

Meta
- 在这样做时,它需要在类主体内内联定义元类的快捷方式:它不会像正常使用时那样将
__metaclass__
名称分配给外部定义的元类,而是就地定义类:从语言运行时的角度来看,它会找到绑定到有效元类的名称
__metaclass__
并使用它来构建类。

后来的版本,甚至在 Python 2 中,修改了这种方法 - 内部类不再是模型或表单的实际“元类”(因为以前的方法显然是多余的)。


1
投票

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' 
© www.soinside.com 2019 - 2024. All rights reserved.