在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允许这样做,因为它肯定是一种编写难以阅读和维护的代码的方法,也是一种混淆的来源?
答案 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>
样式指南实际上列出了一些原因,你可能会在上面的引用下面打破常规约定:
忽略特定指南的其他一些好理由:
- 当应用指南时,即使是习惯于阅读此PEP之后的代码的人,也会使代码的可读性降低。
- 与周围的代码保持一致也会破坏它(可能是出于历史原因) - 尽管这也是一个清理的机会 别人的混乱(真正的XP风格)。
- 因为有问题的代码早于指南的引入,所以没有其他理由可以修改该代码。
- 当代码需要与不支持样式指南推荐功能的旧版Python兼容时。
醇>
答案 1 :(得分:2)
你问题的第一部分是:“是否存在将self参数命名为self之外的其他内容有用的情况?”我不知道有什么真正令人信服的案例,但即使有人提出了完美的例子,它们也很少见,我不会将它们视为这种设计选择的理由:正常使用远比偶尔必须以不直观的方式使用self
。 (请注意,强制使用名称self
不会阻止任何人完成任何操作;它只是一个名称。)
那为什么python允许这个呢?这里有两个问题:为什么要求self
在参数中明确列出(这使我们有机会选择其他名称),以及为什么不将self
变成关键字,例如{{1}在某些其他语言中。
为什么它不是关键字非常清楚:python的设计者总是尽量减少语言中保留字的数量(以便在引入新语法时尽一切努力重用已保留的字,例如{ {1}},this
和yield from
)。因此,如果可以合理地实施某些事情而不是保留字,那就是。
一旦确定from ... import
不是关键字,而是特殊标识符,您如何使它变得特别?使它突然出现在每个类方法的while ... else
字典中会引入“魔术”行为,这也是不可取的:“显式优于隐式”。因此,self
是通过在方法签名中声明引入的,唯一的特殊行为是第一个参数绑定到我们调用其方法的对象。这使得通过装饰器很容易支持静态和类方法,而无需为语言添加特殊语法。 (正如Guido所说,this post解释说,“编写一个在纯Python中实现locals()
或self
的装饰器是微不足道的。”)所以一旦语言以这种方式设计,就真的没有用回来。
答案 2 :(得分:1)
自我参数实际上只是按惯例命名为self,即使是普遍接受的约定 - 我也常常看到 cls 或使用此代替。
术语 self 不是python中的关键字,就像它在Java中一样。用户可以选择为自己想要的任何名称命名 - 虽然最好选择一个名称并在整个代码中坚持使用,但是没有任何东西可以阻止你在每种方法中将其命名为不同的东西。
答案 3 :(得分:1)
This blog post解释了这个问题。 Spesifically:
我认为这个建议没有理由让“自我”成为一个保留词,或者要求前缀名称完全是“自我”。
这只是一个惯例,坚持下去是件好事。