Python类中的“cls”和“self”有什么区别?

cs7cruho  于 2022-10-30  发布在  Python
关注(0)|答案(7)|浏览(224)

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

hc2pp10m1#

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

  • 函数和方法参数 *:

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

holgip5t

holgip5t2#

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

ugmeyewa

ugmeyewa3#

它在类方法的情况下使用。请查看此引用以了解更多详细信息。
编辑:正如Adrien所阐明的,这是一个约定。实际上,除了clsselfPEP8),你可以使用任何东西。

kjthegm6

kjthegm64#

这是一个很好问题,但不像问题那样缺乏'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类。

wd2eg0qa

wd2eg0qa5#

类方法不接受self参数,而是接受一个cls参数,当方法被调用时,该参数指向-而不是对象示例。由于类方法只能访问这个cls参数,它不能修改对象示例状态。这需要访问self。但是,类方法仍然可以修改应用于类的所有示例的类状态。
-* 巨蟒的把戏 *

slhcrj9b

slhcrj9b6#

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

vtwuwzda7#

此代码片段演示了class方法与instance方法之间的差异。
变量名(lol ,的使用是有效的。
注意:变量名(self ,(cls,是 * 样式***而不是***语法 * answered Jan 25, 2011, Baskaya

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'

相关问题