Python类中使用的'cls'变量是什么?

时间:2011-01-06 08:17:54

标签: python class object terminology self

为什么有时会使用cls而不是self作为Python类中的参数?

例如:

class Person:
    def __init__(self, firstname, lastname):
        self.firstname = firstname
        self.lastname = lastname

    @classmethod
    def from_fullname(cls, fullname):
        cls.firstname, cls.lastname = fullname.split(' ', 1)

5 个答案:

答案 0 :(得分:240)

"self""cls"之间的区别在PEP 8中定义。正如阿德里安所说,这不是强制性的。这是一种编码风格。 PEP 8说:

  

函数和方法参数

     

始终使用self作为实例方法的第一个参数。

     

始终使用cls作为类方法的第一个参数。

答案 1 :(得分:49)

它用于类方法的情况。查看this reference了解更多详情。

编辑:正如阿德里安澄清的那样,这是一个惯例。您实际上可以使用clsself之外的任何内容( PEP8 )。

答案 2 :(得分:25)

cls意味着该方法属于该类,而self意味着该方法与该类的实例相关,因此具有cls的成员由类名访问,其中访问self的那个通过类的实例...如果你来自java背景,它与java中的static membernon-static members概念相同。

答案 3 :(得分:8)

这是一个非常好的问题,但并不像缺乏问题那样。 “self”和“cls”使用方法之间存在差异,但类似地,它们位于相同位置

def moon(self,moon_name):
    self.MName =moon_name

#but here cls method its use is different 


def moon(cls,moon_name):
    instance=cls()
    instance.MName=moon_name

现在你可以看到两个都是月亮函数,但是一个可以在类中使用,而其他函数名称月亮可以用于任何类。

对于实用的编程方法:

在设计圆类时我们使用区域方法作为cls而不是self,因为我们不希望区域仅限于特定的圆类。

答案 4 :(得分:0)

  

类方法不接受自身参数,而是采用 cls 参数,该参数指向,而不是对象实例。   该方法被调用。   由于class方法只能访问此cls参数,因此它不能   修改对象实例状态。那将需要自我。但是,类方法仍然可以修改适用于所有方法的类状态   该类的实例。

- Python技巧