首页 > 解决方案 > Django 类方法没有装饰器

问题描述

我看到了几个没有装饰器@classmethod 的类方法。这是什么原因?

https://github.com/django/django/blob/3.0/django/db/models/base.py#L320

在此处输入图像描述

https://github.com/django/django/blob/3.0/django/db/models/manager.py#L20

在此处输入图像描述

标签: pythondjangoclass-method

解决方案


您谈论的项目被用作元类[Python-doc]。可以说元类是类型的类型。例如,如果我们看一下ModelBase源代码 [GitHub],我们会看到:

class ModelBase(type):
    """Metaclass for all models."""
    def __new__(cls, name, bases, attrs, **kwargs):
        super_new = super().__new__

    # …

因此它继承自type,这是元类的基本基类。

因此,这里的“self”对象是被分析、更新等的类本身。虽然一个人本身不需要使用cls,但在元类self中,普通类的名称通常cls在元类定义,强调我们正在操作的类对象本身。


推荐阅读