<p>类基本上由数据(属性)和对数据进行操作的函数(方法)集合组成。每个类的<em>都有自己的<em>方法副本。在</p>
<p>因此,类的每个<sup>*</sup>方法都在类的某个实例上运行,因此该方法需要知道它在哪个<em>实例上操作。这就是<code>self</code>对<code>self</code>的意义,它只表示方法正在处理的实例。在</p>
<p>例如:</p>
<pre><code>class House:
def renovate(self):
''' Renovate a house, increasing its value. '''
self.value += 10000
oldhouse = House() # make a House instance that has no attributes
oldhouse.value = 100000 # set an attribute of the House
mansion = House()
mansion.value = 10000000
oldhouse.renovate() # self will be set to oldhouse, so that oldhouse's value goes up
print oldhouse.value # prints 110000
print mansion.value # prints 10000000: it hasn't changed because renovate knew what it was operating on
</code></pre>
<p>现在,在这个例子中,注意我在类之外设置了<code>.value</code>。您可以这样做(Python允许您在几乎任何实例上设置任何属性),但对每个类都这样做有点麻烦。在</p>
<p>这就是<code>__init__</code>的作用。这是一个有特殊意义的方法(因此有双下划线)。在本例中,它是在创建类时调用的方法(当您使用parens调用类以生成新实例时)。<code>init</code>这里代表<code>initialization</code>:它是初始化类属性的函数。在创建类时,它接受的任何参数(超过<code>self</code>)都是预期的。在</p>
<p>因此,我们可以将示例改为:</p>
^{pr2}$
<p>它的工作原理是一样的,但要稍微好一些(因为我们不必在新的<code>House</code>上继续设置<code>.value</code>)。在</p>
<hr/>
<p><sup>*</sup>除了staticmethods和classmethods,以及<code>__new__</code></p>