在Python中,这段代码是有效的:
class A:
def __init__(me):
me.foo = 17
def print_foo(myself):
print(myself.foo)
def set_foo(i, v):
i.foo = v
您可能已经注意到,
self
参数在 me
方法中命名为 __init__
,在 myself
方法中命名为 print_foo
,在 i
方法中命名为 set_foo
。
是否存在将
self
参数命名为 self
以外的名称有用的情况?如果不是,为什么 Python 允许这样做,因为这肯定是一种编写难以阅读和维护的代码的方式,而且也是造成混乱的根源?
始终使用
作为实例方法的第一个参数。self
始终使用
作为类方法的第一个参数。cls
尽管请记住,作为 python 风格指南,这是未强制执行的
但是,知道何时要不一致——有时是风格指南 建议根本不适用。如有疑问,请尽力而为 判断。查看其他示例并决定哪个看起来最好。
有时,就像标准库中的
fractions.py
一样,使用a,b
之类的东西代替
self,other
可能会更清楚,因为
<your specific reasons>
风格指南实际上在上面的引用下面列出了一些你可能会打破惯例的原因:
忽略特定准则的其他一些充分理由:
应用指南会降低代码的可读性,即使对于习惯阅读遵循此 PEP 的代码的人也是如此。
- 与周围也破坏它的代码保持一致(可能是出于历史原因)——尽管这也是一个清理的机会 把别人搞得一团糟(真正的 XP 风格)。
- 因为相关代码早于指南的引入,并且没有其他原因需要修改该代码。
- 当代码需要与不支持样式指南推荐的功能的旧版 Python 保持兼容时。
self
。 (请注意,强制使用名称
self
不会阻止任何人完成任何事情;它只是一个名称。)那么为什么Python允许这样做呢?这里有两个问题:为什么要求
self
在参数中显式列出(这使我们有机会选择另一个名称),以及为什么不将
self
作为关键字,就像某些其他语言中的
this
一样。为什么它不是一个关键字是非常清楚的:Python 的设计者总是试图最小化语言中保留字的数量(以至于在引入新语法时尽一切努力重用已经保留的字,例如使用
yield from
、
from ... import
和
while ... else
)。因此,如果某些东西可以在不使用保留字的情况下合理地实现,那么它就是。一旦确定
self
不是关键字,而是特殊标识符,如何使其特殊?让它突然出现在每个类方法的
locals()
字典中会引入“神奇”行为,这也是不受欢迎的:“显式优于隐式。”因此,
self
是通过在方法签名中声明来引入的,唯一的特殊行为是第一个参数绑定到我们调用其方法的对象。这使得通过装饰器支持静态和类方法变得很容易,而无需向语言添加特殊语法。 (正如 Guido 的this post 所解释的那样,“编写一个在纯 Python 中实现
@classmethod
或
@staticmethod
的装饰器是微不足道的。”)因此,一旦语言以这种方式设计,就真的没有回头路了。
参数实际上只是按惯例命名为 self,这甚至不是普遍接受的惯例 - 我也经常看到使用 cls 或 this 来代替。 术语
self并不是 Python 中的关键字,就像 Java 中的关键字一样。用户可以选择将其命名为他们想要的任何名称 - 尽管为了清晰起见,最好选择一个名称并在整个代码中坚持使用该名称,但没有什么可以阻止您在每种方法中将其命名为不同的名称。