【问题标题】:Difference between 'cls' and 'self' in Python classes?Python类中'cls'和'self'的区别?
【发布时间】:2011-06-04 12:31:48
【问题描述】:

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

【问题讨论】:

    标签: python class object terminology self


    【解决方案1】:

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

    函数和方法参数:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 感谢Java参考,现在明白了。
      • 谢谢你提到static member和non-static members,在c++的上下文中理解它
      【解决方案3】:

      在类方法的情况下使用。详情请查看this reference。

      编辑:正如 Adrien 所阐明的,这是一个约定。您实际上可以使用任何东西,但使用 cls 和 self (PEP8)。

      【讨论】:

        【解决方案4】:

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

        对于实用的编程方法:

        在设计圆形类时,我们使用 area 方法作为 cls 而不是 self,因为我们不希望区域仅限于特定的圆形类。

        【讨论】:

        • 如果您想添加更多代码人员正在寻找的内容,如果正确,将批准它。
        【解决方案5】:

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

        -Python 技巧

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            猜你喜欢
            • 2011-06-04
            • 2018-12-22
            • 2020-06-16
            • 1970-01-01
            • 2016-02-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-05-28
            相关资源
            最近更新 更多