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

当前回答

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

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

python的技巧

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

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

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

使用变量名(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”和“cls”之间的区别在PEP 8中定义。正如Adrien所说,这不是强制性的。这是一种编码风格。PEP 8说:

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

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