擅长:python、mysql、java
<p>你的问题的第一部分是:“有没有一种情况下,将self参数命名为self以外的东西是有用的?”我不知道有什么真正有说服力的案例,但即使有人提出了完美的例子,它们也很罕见,我也不会把它们作为这个设计选择的理由:正常使用远比偶尔以非直观的方式使用<code>self</code>重要得多。(请注意,强制使用名称<code>self</code>不会阻止任何人完成任何事情;它只是一个名称。)</p>
<p>那么python为什么允许这样做呢?这里有两个问题:为什么要求在参数中显式列出<code>self</code>(这给了我们选择另一个名称的机会),以及为什么不将<code>self</code>变成关键字,比如在某些其他语言中<code>this</code>。在</p>
<p>为什么它不是一个关键字是非常清楚的:python的设计者总是尽量减少语言中保留字的数量(在引入新语法时,例如使用<code>yield from</code>、<code>from ... import</code>、和{<cd8>})时,尽一切努力重用已经保留的单词。因此,如果某件事可以合理地实现而不是保留字,那就是了。在</p>
<p>一旦确定<code>self</code>不是一个关键字,而是一个特殊的标识符,如何使其特殊?使它突然出现在每个类方法的<code>locals()</code>字典中会引入“魔术”行为,这也是不可取的:“显式优于隐式。”因此,<code>self</code>是通过在方法签名中声明来引入的,唯一特殊的行为是第一个参数绑定到我们调用其方法的对象。这使得通过修饰符支持静态方法和类方法变得很容易,而无需向语言添加特殊语法。(正如Guido的<a href="http://neopythonic.blogspot.nl/2008/10/why-explicit-self-has-to-stay.html" rel="nofollow">this post</a>所解释的那样,“用纯Python编写一个实现<code>@classmethod</code>或{<cd13>}的装饰器很简单。”)因此,一旦语言以这种方式设计,就真的没有回头路了。在</p>