将self参数命名为其他内容

时间:2016-06-17 15:32:02

标签: python self

在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,{{1在i方法中。

是否存在将set_foo参数命名为self之外的其他内容有用的情况?如果没有,为什么Python允许这样做,因为它肯定是一种编写难以阅读和维护的代码的方法,也是一种混淆的来源?

4 个答案:

答案 0 :(得分:3)

PEP 8 addresses this pretty clearly:

  

始终将self用作实例方法的第一个参数。

     

始终使用cls作为类方法的第一个参数。

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

  

然而,知道何时不一致 - 有时风格指南   建议只是不适用。如有疑问,请尽量使用   判断。查看其他示例并确定最佳效果。

有时,与in fractions.py一样,您可能更清楚地使用a,b而非self,other之类的内容,因为<your specific reasons>

样式指南实际上列出了一些原因,你可能会在上面的引用下面打破常规约定:

  

忽略特定指南的其他一些好理由:

     
      
  1. 当应用指南时,即使是习惯于阅读此PEP之后的代码的人,也会使代码的可读性降低。
  2.   
  3. 与周围的代码保持一致也会破坏它(可能是出于历史原因) - 尽管这也是一个清理的机会   别人的混乱(真正的XP风格)。
  4.   
  5. 因为有问题的代码早于指南的引入,所以没有其他理由可以修改该代码。
  6.   
  7. 当代码需要与不支持样式指南推荐功能的旧版Python兼容时。
  8.   

答案 1 :(得分:2)

你问题的第一部分是:“是否存在将self参数命名为self之外的其他内容有用的情况?”我不知道有什么真正令人信服的案例,但即使有人提出了完美的例子,它们也很少见,我不会将它们视为这种设计选择的理由:正常使用远比偶尔必须以不直观的方式使用self。 (请注意,强制使用名称self不会阻止任何人完成任何操作;它只是一个名称。)

那为什么python允许这个呢?这里有两个问题:为什么要求self在参数中明确列出(这使我们有机会选择其他名称),以及为什么不将self变成关键字,例如{{1}在某些其他语言中。

为什么它不是关键字非常清楚:python的设计者总是尽量减少语言中保留字的数量(以便在引入新语法时尽一切努力重用已保留的字,例如{ {1}},thisyield from)。因此,如果可以合理地实施某些事情而不是保留字,那就是。

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

答案 2 :(得分:1)

自我参数实际上只是按惯例命名为self,即使是普遍接受的约定 - 我也常常看到 cls 使用此代替。

术语 self 不是python中的关键字,就像它在Java中一样。用户可以选择为自己想要的任何名称命名 - 虽然最好选择一个名称并在整个代码中坚持使用,但是没有任何东西可以阻止你在每种方法中将其命名为不同的东西。

答案 3 :(得分:1)

来自Guido van Rossum的

This blog post解释了这个问题。 Spesifically:

  

我认为这个建议没有理由让“自我”成为一个保留词,或者要求前缀名称完全是“自我”。

这只是一个惯例,坚持下去是件好事。