356

为什么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)
4

6 回答 6

371

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

函数和方法参数

始终self用于实例方法的第一个参数。

始终cls用于类方法的第一个参数。

于 2011-01-25T15:27:00.810 回答
91

cls意味着方法属于类,而self意味着该方法与类的实例相关,因此cls通过类名访问成员with,而具有self的成员通过类的实例访问......这是相同的概念如果您来自 java 背景,则与 javastatic member一样。non-static members

于 2018-03-11T14:55:10.853 回答
60

它用于类方法的情况。查看此参考以获取更多详细信息。

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

于 2011-01-06T08:21:10.703 回答
28

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

于 2017-06-17T08:55:18.357 回答
7

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

-蟒蛇技巧

于 2019-09-27T05:43:18.033 回答
3

如果要通过实例访问方法,请将第一个参数保留为 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')
于 2021-10-20T22:07:13.670 回答