Django的元类是如何工作的?

2024-04-26 04:57:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用的Django允许人们通过使用class Meta向类添加额外的参数。

class FooModel(models.Model):
    ...
    class Meta:
        ...

我在Python的文档中发现的唯一东西是:

class FooMetaClass(type):
    ...

class FooClass:
    __metaclass__ = FooMetaClass

但是,我不认为这是同一件事。


Tags: django文档参数modelmodelstypemetaclass
3条回答

你在问两个不同的问题:

  1. Django模型中的内部类:

    这只是一个类容器,模型附加了一些选项(元数据)。它定义了可用权限、关联的数据库表名、模型是否抽象、名称的单数和复数形式等

    这里有一个简短的解释:Django docs: Models: Meta options

    可用的元选项列表如下:Django docs: Model Meta options

  2. Python中的元类:

    最好的描述如下:What is a metaclass in Python?

在上面Tadeck的Django答案的基础上,在Django中使用“class Meta:”也只是普通的Python。

内部类是类实例之间共享数据的方便命名空间(因此“Meta”的名称为Meta,但您可以随意调用它)。在Django中,它通常是只读配置,没有什么可以阻止您更改它:

In [1]: class Foo(object):
   ...:     class Meta:
   ...:         metaVal = 1
   ...:         
In [2]: f1 = Foo()
In [3]: f2 = Foo()
In [4]: f1.Meta.metaVal
Out[4]: 1
In [5]: f2.Meta.metaVal = 2
In [6]: f1.Meta.metaVal
Out[6]: 2
In [7]: Foo.Meta.metaVal
Out[7]: 2

您也可以在Django直接浏览,例如:

In [1]: from django.contrib.auth.models import User
In [2]: User.Meta
Out[2]: django.contrib.auth.models.Meta
In [3]: User.Meta.__dict__
Out[3]: 
{'__doc__': None,
 '__module__': 'django.contrib.auth.models',
 'abstract': False,
 'verbose_name': <django.utils.functional.__proxy__ at 0x26a6610>,
 'verbose_name_plural': <django.utils.functional.__proxy__ at 0x26a6650>}

但是,在Django中,您更可能希望在创建模型时探索由模型创建的metaclass对象Options属性。在这里您可以找到所有Django类的“meta”信息。在Django中,Meta只用于将信息传递到创建_metaOptions对象的过程中。

Django的Model类专门处理具有名为Meta的属性的类。这不是一般的Python。

Python元类完全不同。

相关问题 更多 >