繁体   English   中英

“自我”在@classmethod中引用了什么?

[英]What does 'self' refer to in a @classmethod?

我以为我开始掌握编程的“Python方式”。 类的方法接受self作为第一个参数来引用正在调用该方法的上下文的类的实例。@ classmethod装饰器引用一个方法,其功能与类相关联,但不引用具体实例。

那么,如果没有实例引用调用该方法,那么@classmethod(规范'self')的第一个参数是什么意思?

类本身

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

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

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

和它的cls规范地,顺便说一句

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

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'

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

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

将返回Foo类的实例。

编辑

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM