为什么在Python类中有时使用cls而不是self作为参数?
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)
它用于类方法的情况。查看这个引用了解更多细节。
编辑:正如Adrien澄清的那样,这是一种惯例。你实际上可以使用任何东西,但cls和self被使用(PEP8)。
"self"和"cls"之间的区别在PEP 8中定义。正如Adrien所说,这不是强制性的。这是一种编码风格。PEP 8说:
"self"
"cls"
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 member和non-static members是相同的概念。
static member
non-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方法之间的区别。
class
instance
使用变量名(lol ,是有效的。
(lol ,
注:变量名(self ,和(cls, 分别为风格 不 语法 2011年1月25日,巴斯卡亚回答道
(self ,
(cls,
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'