将 self 参数命名为其他名称

问题描述 投票:0回答:4

在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 允许这样做,因为这肯定是一种编写难以阅读和维护的代码的方式,而且也是造成混乱的根源?

python self
4个回答
4
投票

PEP 8 非常清楚地解决了这个问题:

始终使用

self
作为实例方法的第一个参数。

始终使用

cls
作为类方法的第一个参数。

尽管请记住,作为 python 风格指南,这是未强制执行的

但是,知道何时要不一致——有时是风格指南 建议根本不适用。如有疑问,请尽力而为 判断。查看其他示例并决定哪个看起来最好。

有时,就像标准库中的

fractions.py
一样,使用a,b
之类的东西代替
self,other
可能会更清楚,因为
<your specific reasons>

风格指南实际上在上面的引用下面列出了一些你可能会打破惯例的原因:

忽略特定准则的其他一些充分理由:

    应用指南会降低代码的可读性,即使对于习惯阅读遵循此 PEP 的代码的人也是如此。
  1. 与周围也破坏它的代码保持一致(可能是出于历史原因)——尽管这也是一个清理的机会 把别人搞得一团糟(真正的 XP 风格)。
  2. 因为相关代码早于指南的引入,并且没有其他原因需要修改该代码。
  3. 当代码需要与不支持样式指南推荐的功能的旧版 Python 保持兼容时。

3
投票
您问题的第一部分是:“是否存在将 self 参数命名为 self 以外的名称有用的情况?”我不知道有什么真正令人信服的案例,但即使有人提出了完美的例子,它们也很罕见,我不会将它们视为这种设计选择的原因:正常使用远比偶尔不得不以不直观的方式使用

self

。 (请注意,强制使用名称 
self
 不会阻止任何人完成任何事情;它只是一个名称。) 

那么为什么Python允许这样做呢?这里有两个问题:为什么要求

self

 在参数中显式列出(这使我们有机会选择另一个名称),以及为什么不将 
self
 作为关键字,就像某些其他语言中的 
this
 一样。 

为什么它不是一个关键字是非常清楚的:Python 的设计者总是试图最小化语言中保留字的数量(以至于在引入新语法时尽一切努力重用已经保留的字,例如使用

yield from

from ... import
while ... else
)。因此,如果某些东西可以在不使用保留字的情况下合理地实现,那么它就是。 

一旦确定

self

不是关键字,而是特殊标识符,如何使其特殊?让它突然出现在每个类方法的 
locals()
 字典中会引入“神奇”行为,这也是不受欢迎的:“显式优于隐式。”因此,
self
是通过在方法签名中声明来引入的,唯一的特殊行为是第一个参数绑定到我们调用其方法的对象。这使得通过装饰器支持静态和类方法变得很容易,而无需向语言添加特殊语法。 (正如 Guido 的 
this post 所解释的那样,“编写一个在纯 Python 中实现 @classmethod
@staticmethod
 的装饰器是微不足道的。”)因此,一旦语言以这种方式设计,就真的没有回头路了。


3
投票

围绕这个主题做了一些解释。具体来说:

我认为该提案没有理由将“self”作为保留字或要求前缀名称完全是“self”。

这只是一个约定,坚持下去就好了。


0
投票
self

参数实际上只是按惯例命名为 self,这甚至不是普遍接受的惯例 - 我也经常看到使用 clsthis 来代替。 术语

self

并不是 Python 中的关键字,就像 Java 中的关键字一样。用户可以选择将其命名为他们想要的任何名称 - 尽管为了清晰起见,最好选择一个名称并在整个代码中坚持使用该名称,但没有什么可以阻止您在每种方法中将其命名为不同的名称。

© www.soinside.com 2019 - 2024. All rights reserved.