ChatGPT解决这个技术问题 Extra ChatGPT

Python类中'cls'和'self'之间的区别?

为什么有时使用 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)

S
Sabito 錆兎 stands with Ukraine

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

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


y
yabhishek

cls 表示方法属于该类,而 self 表示该方法与该类的实例相关,因此具有 cls 的成员通过类名访问,而具有 self 的成员通过类的实例访问。 .it 与 java 中的 static membernon-static members 的概念相同,如果您来自 java 背景。


谢谢你的Java参考,现在明白了。
比你提到的 static membernon-static members,在 c++ 的上下文中理解它
B
Billal Begueradj

它用于类方法的情况。查看 this reference 了解更多详情。

编辑:正如 Adrien 所澄清的,这是一个约定。除了使用 clsself (PEP8) 之外,您实际上可以使用任何东西。


T
Tin Nguyen

这是一个很好的问题,但不像问题那么需要。 '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 类。


如果您想添加更多编码人员正在寻找的内容,如果正确,将批准它。
t
theEpsilon

当调用方法时,类方法不接受 self 参数,而是接受指向类而不是对象实例的 cls 参数。由于类方法只能访问这个 cls 参数,它不能修改对象实例状态。那将需要访问 self 。但是,类方法仍然可以修改适用于类的所有实例的类状态。

-Python技巧


R
Rahul Jha

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