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

时间:2009-08-06 17:10:37

标签: python naming-conventions

我正在教自己Python,我在Dive into Python section 5.3中看到以下内容:

  

按照惯例,任何Python类方法的第一个参数(对当前实例的引用)都称为self。此参数在C ++或Java中填充保留字this的角色,但self不是Python中的保留字,仅仅是命名约定。尽管如此,除了self之外,请不要打电话给它。这是一个非常强大的惯例。

考虑到self 不是 Python关键字,我猜测使用其他东西有时会很有用。有这种情况吗?如果没有,为什么是关键字?

6 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:5)

作为一个侧面观察,请注意Pilgrim在这里犯了一个常见的滥用术语:类方法实例方法完全不同,这是什么他在这里谈论。正如wikipedia所说,“一个方法是一个子程序,它只与一个类(在这种情况下称为类方法或静态方法)或一个对象(在这种情况下它是一个实例)相关联。方法)。”。 Python的内置函数包括staticmethod类型,用于创建静态方法,以及classmethod类型,用于创建类方法,每个类通常用作装饰器;如果你不使用它们,则类体中的def会生成实例方法。 E.g:

>>> 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'>
>>> 

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

因此使用self作为类方法的第一个参数的名称会非常非常令人困惑和误导:在这种情况下,惯例是使用{{1} },如上面的例子。虽然这只是一个惯例,但是没有真正的理由可以违反它 - 比如说,如果变量的目的是计算狗的话,那就命名一个变量cls了! - )

答案 2 :(得分:4)

我见过的唯一一个例子就是在类定义之外定义一个函数,然后将它分配给类,例如:

class Foo(object):
    def bar(self):
        # Do something with 'self'

def baz(inst):
    return inst.bar()

Foo.baz = baz

在这种情况下,使用self有点奇怪,因为该函数可以应用于许多类。我经常看到使用instcls代替。

答案 3 :(得分:2)

我曾经有过一些代码(我为示例中缺乏创造力而道歉):

class Animal:
    def __init__(self, volume=1):
        self.volume = volume
        self.description = "Animal"

    def Sound(self):
        pass

    def GetADog(self, newvolume):
        class Dog(Animal):
            def Sound(this):
                return self.description + ": " + ("woof" * this.volume)
        return Dog(newvolume)

然后我们输出如下:

>>> a = Animal(3)
>>> d = a.GetADog(2)
>>> d.Sound()
'Animal: woofwoof'

我不确定self课程中的Dog是否会在self课程中影响Animal,所以我选择Dog改为引用“this”这个词。在我看来,对于那个特定的应用程序,我更清楚。

答案 4 :(得分:1)

我认为惯例使用self而不是Python关键字的主要原因是因为让所有方法/函数以相同的方式获取参数更简单,而不必为函数组合不同的参数形式,类方法,实例方法等。

请注意,如果您有一个实际类方法(即使用classmethod装饰器定义的方法),则惯例是使用“cls”而不是“self”。

答案 5 :(得分:1)

因为它是一种约定,而不是语言语法。有一个Python style guide用Python编程的人跟随。这样,库具有熟悉的外观和感觉。 Python非常强调可读性,而一致性是这一点的重要组成部分。