在Python中定义一个引用self而不称为"self"的类方法是否有用?

Nat*_*man 3 python naming-conventions

我正在自学Python,我在Dive into Python 第5.3节中看到以下内容:

按照惯例,调用任何Python类方法的第一个参数(对当前实例的引用)self.这个参数填充了thisC++或Java中保留字的作用,但self它不是Python中的保留字,仅仅是命名约定.尽管如此,请不要称之为self; 这是一个非常强大的惯例.

考虑到self不是一个Python关键字,我猜,这有时会使用别的有用的.有这种情况吗?如果没有,为什么它不是关键字?

And*_*are 9

不,除非你想在编写代码之后混淆每个查看代码的程序员. self不是关键字,因为它是标识符.它可能是一个关键词,事实上它不是一个设计决策.

  • 但是,如果你正在使用`@ classmethod`,那么第一个参数不是`self`,它通常是`cls`. (2认同)

Ale*_*lli 5

作为一个侧面观察,请注意Pilgrim在这里犯了一个常见的滥用术语:类方法实例方法完全不同,这是他在这里所说的.正如维基百科所说,"方法是一个子程序,它只与一个类(在这种情况下称为类方法或静态方法)或一个对象(在这种情况下它是一个实例方法)相关联." .Python的内置函数包括一个staticmethod类型,用于创建静态方法,一个classmethod类型,用于创建类方法,每个方法通常用作装饰器; 如果你不使用任何一个def,则在类体中创建一个实例方法.例如:

>>> class X(object):
...   def noclass(self): print self
...   @classmethod
...   def withclass(cls): print cls
... 
>>> x = X()
>>> x.noclass()
<__main__.X object at 0x698d0>
>>> x.withclass()
<class '__main__.X'>
>>> 
Run Code Online (Sandbox Code Playgroud)

如您所见,instance方法noclass将实例作为其参数,但class方法withclass获取类.

因此,使用类方法的第一个参数的名称会非常混乱和误导self:在这种情况下,惯例是使用cls,如上例所示.虽然这只是一个惯例,但是没有真正的理由可以违反它 - 比如说,number_of_cats如果变量的目的是计算狗的话,那么命名一个变量就更多了! - )