<p>如果你考虑一下,每种编程语言都会这样做——或者至少,像pascal、c++或java这样最常见的语言都会这样做)。但是,在大多数编程语言中,<code>this</code>关键字是假定的,而不是作为参数传递的。考虑一下这些语言中的函数指针:它们与方法指针不同。在</p>
<p>帕斯卡:</p>
<pre><code>function(a: Integer): Integer;
</code></pre>
<p>与</p>
^{pr2}$
<p>后者考虑<code>self</code>指针(是的,它的名称是<code>self</code>,但它是一个隐式指针,类似于c++中的<code>this</code>,而python<code>self</code>是显式的)。在</p>
<P> C++:</P>
<pre><code>typedef int (*mytype)(int a);
</code></pre>
<p>与</p>
<pre><code>typedef int Anyclass::(*mytype)(int a);
</code></pre>
<P>与Pascal的差异,在C++中,必须指定拥有该方法的类。无论如何,这个方法指针声明声明了一个函数与一个不需要<code>this</code>的函数之间的区别。在</p>
<p>但是Python很认真,就像quichua人对待他们的Ama Suway,Ama Llullay,Ama K'ellay一样</p>
<pre><code>Explicit is better than implicit.
</code></pre>
<p>所以,这就是为什么您看到<em>显式地</em>为实例方法和<code>@classmethod</code>的<code>self</code>参数(当然必须编写它)(尽管它通常被称为<code>cls</code>,因为它的目的是动态地知道类而不是实例)。Python不假定方法中必须存在<code>this</code>或<code>self</code>关键字(因此,名称空间只有真正的变量-请记住,您不必将它们命名为<code>self</code>或{<cd9>},尽管这是通常和预期的)。在</p>
<p>最后,如果您得到:</p>
<pre><code>x = AClass.amethod #unbound method
</code></pre>
<p>你必须称之为</p>
<pre><code>x(aninstance, param, param2, ..., named=param, named2=param2, ...)
</code></pre>
<p>而得到的结果是:</p>
<pre><code>x = anInstance.method #bound method, has `im_self` attribute set to the instance.
</code></pre>
<p>必须称为:</p>
<pre><code>x(param, param2, ..., named=param, named2=param2, ...)
</code></pre>
<p>是的,<code>self</code>在参数列表中是显式的,因为它不假定关键字或“后门”必须存在,但在参数列表中不存在,因为每个OOP语言都有语法糖分(奇怪的标准,哈?)。在</p>