<> P>有助于记住Python中的^ {CD1>}语句比任何其他块语句都要接近C++语言的情况。在</p>
<p>在Python中,<code>class</code>语句包含一组要执行的语句,就像<code>def</code>、<code>if</code>、或{<cd5>}。区别在于解释器如何处理块。在流控制块语句的情况下,如<code>if</code>和<code>while</code>,解释器按照流控制语句的含义执行块。在<code>def</code>中,解释器保存块并在调用函数对象时执行它。在</p>
<p>在<code>class</code>块的情况下,Python<em>立即在一个新的作用域中执行该块,然后在执行完成后使用该作用域中剩余的内容作为类的内容。在</p>
<p>为此:</p>
<pre><code>class testa():
a = []
</code></pre>
<p>Python执行块<code>a = []</code>。最后,范围包含绑定到空列表对象的<code>a</code>。所以这就是你的<strong>课程</strong>。不是类的任何特定实例,而是类本身。在</p>
<p>它从<code>object</code>继承了一个什么都不做的构造函数,这样当您用<code>ta1 = testa()</code>实例化该类时,会得到一个空实例。然后当您请求<code>ta1.a</code>时,Python找不到名为<code>a</code>的实例变量(因为<code>ta1</code>根本没有实例变量),因此它在类<code>testa</code>中查找<code>a</code>。当然,它会找到;但是对于<code>testa</code>的每个实例,它都会找到相同的一个,因此您得到了所观察到的行为。在</p>
<p>另一方面:</p>
^{pr2}$
<p>完全不同。在这里,一旦类块被执行,类作用域的内容又是一个单一的名称,但这次它是<code>__init__</code>绑定到函数的。这就成了课程的内容。在</p>
<p>现在,当您用<code>testb()</code>实例化<strong>这个</strong>类时,Python会在类中找到<code>__init__</code>,并用新实例调用该函数。执行该函数将在新实例中创建一个<code>a</code><em>实例</em>变量。因此,<code>testb()</code>的每个实例都有自己的变量,您可以观察到它的行为。在</p>
<P>带回家消息:Python中的一个^ {CD1>}块是“强>不<强”。只是一组声明的事物,包含在该类的实例中,不像传统的OO-ISH语言,如C++和java。实际执行的代码定义类的内容。这非常方便:您可以在类主体中使用if语句、函数执行的结果以及任何其他上下文中使用的内容来决定在类中定义什么。在</p>
<p>(<strong>注意</strong>:我之前为了简单起见撒了谎。即使是<code>testa</code>的实例也会有一些实例变量,因为默认情况下会为所有实例自动创建一些实例变量,但是在日常的Python中看不到这些变量)。在</p>