代码之家  ›  专栏  ›  技术社区  ›  Yes - that Jake.

@classmethod中的“self”指的是什么?

  •  18
  • Yes - that Jake.  · 技术社区  · 17 年前

    那么,如果要在没有实例引用的情况下调用@classmethod(通常称为“self”)的第一个参数,那么它指的是什么?

    4 回复  |  直到 17 年前
        1
  •  38
  •   Dana    17 年前

    class itself :

    类方法接收类作为隐式第一个参数,就像实例方法接收实例一样。

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

    而且是 cls 当然,顺便说一句

        2
  •  16
  •   Torsten Marek    17 年前

    classmethod的第一个参数命名为 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
  •  0
  •   Jason Baker    17 年前

    类对象作为第一个参数传递。例如:

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

    将返回Foo类的实例。

    编辑

    请注意,最后一行是self()而不是self。self将返回类本身,而self()将返回实例。

        4
  •  0
  •   boatcoder    13 年前

    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_前缀是这样声明的(在同一类中):

        @classmethod
        def get_default_prefix(cls):
            return 'form'