Что означает "я" в классе @class?
Мне показалось, что я начинаю понимать "путь на Python" программирования. Методы класса принимают себя как первый параметр для обращения к экземпляру класса, контекст которого вызывает метод. Декоратор @classmethod относится к методу, функциональность которого связана с классом, но который не ссылается на конкретный экземпляр.
Итак, что относится к первому параметру класса @classmethod (канонически "я" ), если этот метод предназначен для вызова без ссылки на экземпляр?
Ответы
Ответ 1
класс:
Метод класса получает класс как неявный первый аргумент, так же как метод экземпляра получает экземпляр.
class C:
@classmethod
def f(cls):
print(cls.__name__, type(cls))
>>> C.f()
C <class 'type'>
и it cls
канонически, btw
Ответ 2
Первый параметр метода класса называется cls
по соглашению и ссылается на объект класса, в котором был вызван метод.
>>> class A(object):
... @classmethod
... def m(cls):
... print cls is A
... print issubclass(cls, A)
>>> class B(A): pass
>>> a = A()
>>> a.m()
True
True
>>> b = B()
>>> b.m()
False
True
Ответ 3
Объект класса передается как первый параметр. Например:
class Foo(object):
@classmethod
def bar(self):
return self()
Вернул бы экземпляр класса Foo.
ИЗМЕНИТЬ
Обратите внимание, что последняя строка будет self() not self. self будет возвращать сам класс, а self() возвращает экземпляр.
Ответ 4
Django делает некоторые странные вещи с помощью метода класса:
class BaseFormSet(StrAndUnicode):
"""
A collection of instances of the same Form class.
"""
def __init__(self, data=None, files=None, auto_id='id_%s', prefix=None,
initial=None, error_class=ErrorList):
...
self.prefix = prefix or self.get_default_prefix()
...
Даже если get_default_prefix объявлен таким образом (в том же классе):
@classmethod
def get_default_prefix(cls):
return 'form'