将 self 参数命名为其他名称

Naming the self parameter something else

在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 参数在 __init__ 方法中命名为 me,在 print_foo 方法中命名为 myself,并且 iset_foo 方法中。

是否存在将 self 参数命名为 self 以外的名称有用的情况?如果不是,为什么 Python 允许这样做,因为这肯定是一种编写难以阅读和维护的代码的方式,也是混淆的根源?

self 参数实际上只是按照约定命名为 self,这甚至不是一个普遍接受的约定 - 我也经常看到 clsthis 代替。

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

Guido van Rossum 的

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

I see no reason with this proposal to make 'self' a reserved word or to require that the prefix name be exactly 'self'.

这只是一个惯例,坚持下去就好了。

PEP 8 addresses this pretty clearly:

Always use self for the first argument to instance methods.

Always use cls for the first argument to class methods.

虽然记得是 python style guide this is not enforced

However, know when to be inconsistent -- sometimes style guide recommendations just aren't applicable. When in doubt, use your best judgment. Look at other examples and decide what looks best.

有时,like in fractions.py in the standard library,使用 a,b 之类的东西可能比 self,other 更清楚,因为 <your specific reasons>

风格指南实际上在上面的引用下方列出了一些您可能会违反惯例的原因:

Some other good reasons to ignore a particular guideline:

  1. When applying the guideline would make the code less readable, even for someone who is used to reading code that follows this PEP.
  2. To be consistent with surrounding code that also breaks it (maybe for historic reasons) -- although this is also an opportunity to clean up someone else's mess (in true XP style).
  3. Because the code in question predates the introduction of the guideline and there is no other reason to be modifying that code.
  4. When the code needs to remain compatible with older versions of Python that don't support the feature recommended by the style guide.

你问题的第一部分是:"Is there a situation in which naming the self parameter something other than self is useful?"我不知道有什么真正令人信服的案例,但即使有人想出了完美的例子,它们也很少见,我不会将它们视为此设计选择的原因:正常使用远比偶尔不得不以不直观的方式使用 self 重要得多。 (请注意,强制使用名称 self 不会阻止任何人完成任何事情;它只是一个名称。)

那么为什么 python 允许这样做呢?这里有两个问题:为什么要求 self 明确地列在参数中(这让我们有机会选择另一个名字),为什么不把 self 变成关键字,比如 this 在某些其他语言中。

为什么它不是关键字非常清楚:python 的设计者总是试图尽量减少语言中保留字的数量(以至于在新语法出现时尽一切努力重用已经保留的字)被引入,例如 yield fromfrom ... importwhile ... else)。因此,如果某些东西可以在没有保留字的情况下合理地实现,那就是。

既然确定了self不是关键字,而是特殊的标识符,那么如何让它变得特殊呢?让它突然出现在每个 class 方法的 locals() 字典中会引入 "magic" 再次不受欢迎的行为: "Explicit is better than implicit." 所以, self 是通过声明引入的方法签名,唯一的特殊行为是第一个参数绑定到我们调用其方法的对象。这使得通过装饰器支持静态和 class 方法变得容易,而无需向语言添加特殊语法。 (正如 Guido 的 this post 解释的那样,"it's trivial to write a decorator that implements @classmethod or @staticmethod in pure Python.")所以一旦语言被设计成这种方式,就真的没有回头路了。