为什么在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”使用的方法之间有区别,尽管类推它们在同一个地方

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作为类方法的第一个参数。

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

使用变量名(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'

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

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

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只局限于特定的圆类。