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

例如:

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)

当前回答

CLS意味着方法属于类,而self意味着方法与类的实例相关,因此带有CLS的成员是通过类名访问的,而带有self的成员是通过类的实例访问的……如果你有Java背景,它与Java中的静态成员和非静态成员是相同的概念。

其他回答

如果您想通过实例访问一个方法,请将第一个参数保留为self。例如:

class Test:
   def hello(self, name):
      print ('hello ', name)

obj = Test()
obj.hello('Rahul')

如果你想像在静态类中那样使用类名访问方法,最好使用cls作为方法的第一个参数。例如:

class Test:
       def hello(cls, name):
          print ('hello ', name)


Test.hello('Rahul')

它用于类方法的情况。请查看此参考资料以了解更多细节。

编辑:正如Adrien澄清的那样,这是一种惯例。你实际上可以使用任何东西,但cls和self被使用(PEP8)。

“self”和“cls”之间的区别在PEP 8中定义。正如Adrien所说,这不是强制性的。这是一种编码风格。PEP 8说:

函数和方法参数: 始终使用self作为实例方法的第一个参数。 总是使用cls作为类方法的第一个参数。

类方法不接受self参数,而是接受指向类(而不是对象实例)的cls参数 该方法被调用。 因为类方法只能访问这个cls参数,所以它不能 修改对象实例状态。那就需要进入自我。但是,类方法仍然可以修改应用于所有类的类状态 类的实例。

python的技巧

这是个很好的问题,但不像问题那样令人生厌。 “自我”和“cls”使用的方法之间有区别,尽管类推它们在同一个地方

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

#but here cls method its use is different 

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

现在你可以看到两个都是moon函数,但一个可以在类内部使用,而另一个函数名称moon可以用于任何类。

对于实际编程方法:

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