我正在教自己Python,我在Dive into Python section 5.3中看到以下内容:
按照惯例,任何Python类方法的第一个参数(对当前实例的引用)都称为
self
。此参数在C ++或Java中填充保留字this
的角色,但self
不是Python中的保留字,仅仅是命名约定。尽管如此,除了self
之外,请不要打电话给它。这是一个非常强大的惯例。
考虑到self
不是 Python关键字,我猜测使用其他东西有时会很有用。有这种情况吗?如果没有,为什么不是关键字?
答案 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
有点奇怪,因为该函数可以应用于许多类。我经常看到使用inst
或cls
代替。
答案 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非常强调可读性,而一致性是这一点的重要组成部分。