Что означает «я» в @classmethod? - PullRequest
19 голосов
/ 10 февраля 2009

Мне показалось, что я начинаю понимать «путь Python» программирования. Методы класса принимают self в качестве первого параметра, ссылающегося на экземпляр класса, в контексте которого вызывается метод. Декоратор @classmethod ссылается на метод, функциональность которого связана с классом, но который не ссылается на конкретный экземпляр.

Итак, на что ссылается первый параметр @classmethod (канонически 'self'), если метод должен вызываться без ссылки на экземпляр?

Ответы [ 4 ]

36 голосов
/ 10 февраля 2009

сам класс :

Метод класса получает класс в качестве неявного первого аргумента, так же, как метод экземпляра получает экземпляр.

class C:
    @classmethod
    def f(cls):
        print(cls.__name__, type(cls))

>>> C.f()
C <class 'type'>

и это cls канонически, кстати

14 голосов
/ 10 февраля 2009

Первый параметр метода класса назван 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
0 голосов
/ 13 марта 2013

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'
0 голосов
/ 10 февраля 2009

Объект класса передается в качестве первого параметра. Например:

class Foo(object):
    @classmethod
    def bar(self):
        return self()

Возвращает экземпляр класса Foo.

EDIT

Обратите внимание, что последняя строка будет self (), а не self. self возвращает сам класс, а self () возвращает экземпляр.

...