Django метод не имеет декоратора - PullRequest
1 голос
/ 03 апреля 2020

Я видел пару методов класса, у которых нет декоратора @classmethod. В чем причина?

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

enter image description here

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

enter image description here

1 Ответ

4 голосов
/ 03 апреля 2020

Предметы, о которых вы говорите, используются как метаклассы [Python -doc] . Можно сказать, что метакласс является типом типа. Если мы, например, взглянем на ModelBase кодекс источника [GitHub] , мы увидим:

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

    # &hellip;

Это так наследуется от type, который является базовым c базовым классом мета-классов.

Здесь, таким образом, "self" объект - это сам класс, который анализируется, обновляется и т. д. c. Хотя по сути нет необходимости использовать cls, обычно в мета-классах то, что было бы self из обычного класса, называется cls в определении мета-класса , чтобы подчеркнуть тот факт, что мы сами манипулируем объектом класса.

...