' class '和& # 39;自我# 39;在Python类中?

为什么在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)
324310 次浏览

它用于类方法的情况。查看这个引用了解更多细节。

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

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

函数和方法参数:

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

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

这是一个很好的问题,但不像问题那样令人生厌。 'self'和'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可以用于任何类。

对于实际编程方法:

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

cls暗示方法属于类,而self暗示方法与类的实例相关,因此带有cls的成员是通过类名访问的,而带有self的成员是通过类的实例访问的……如果你来自java背景,它与java中的static membernon-static members是相同的概念。

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

-Python的技巧

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

这段代码片段演示了class方法和instance方法之间的区别。

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

注:变量名(self ,(cls, 分别为风格 语法 2011年1月25日,巴斯卡亚回答道

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'