为什么在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)

当前回答

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

python的技巧

其他回答

这段代码片段演示了类方法和实例方法之间的区别。

使用变量名(lol,是有效的。

注:变量名(self,和(cls,是样式不是语法回答2011年1月25日,Baskaya

class Parent:
    greeting = 'Good morning'
    name = 'Mum'
    def greet(lol):
        return lol.greeting
    def who_am_i(lol):
        return 'i am ' + lol.name

class Child(Parent):
    greeting = 'mate'
    @classmethod
    def greet(lol):
        return lol.greeting

>>> p = Parent()
>>> print(p.greet(), p.who_am_i() )
'Good morning i am Mum'
>>> c = Child()
>>> print(c.greet(), c.who_am_i() )
'mate i am Mum'

如果您想通过实例访问一个方法,请将第一个参数保留为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')

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

这是个很好的问题,但不像问题那样令人生厌。 “自我”和“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只局限于特定的圆类。

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

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