为什么有时使用 cls
而不是 self
作为 Python 类中的参数?
例如:
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"
之间的区别在 PEP 8
中定义。正如 Adrien 所说,这不是强制性的。这是一种编码风格。 PEP 8
说:
函数和方法参数:始终使用 self 作为实例方法的第一个参数。始终使用 cls 作为类方法的第一个参数。
cls
表示方法属于该类,而 self 表示该方法与该类的实例相关,因此具有 cls
的成员通过类名访问,而具有 self 的成员通过类的实例访问。 .it 与 java 中的 static member
和 non-static members
的概念相同,如果您来自 java 背景。
它用于类方法的情况。查看 this reference 了解更多详情。
编辑:正如 Adrien 所澄清的,这是一个约定。除了使用 cls
和 self
(PEP8) 之外,您实际上可以使用任何东西。
这是一个很好的问题,但不像问题那么需要。 '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 可用于任何类。
对于实用的编程方法:
在设计 circle 类时,我们使用 area 方法作为 cls 而不是 self,因为我们不希望 area 仅限于特定的 circle 类。
当调用方法时,类方法不接受 self 参数,而是接受指向类而不是对象实例的 cls 参数。由于类方法只能访问这个 cls 参数,它不能修改对象实例状态。那将需要访问 self 。但是,类方法仍然可以修改适用于类的所有实例的类状态。
-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')
static member
和non-static members
,在 c++ 的上下文中理解它