擅长:python、mysql、java
<p>关键在于区分实例变量和类变量。你知道吗</p>
<p>循环:</p>
<pre><code>for klass in (Inheritor, Replacer, Extender):
klass().method()
</code></pre>
<p>迭代3个类。它创建每个的(临时)实例并对其调用<code>method()</code>。让我们看看会发生什么:</p>
<hr/>
<p><code>Inheritor().method()</code>创建<code>Inheritor</code>的新实例并设置<code>self.x = self.x + 1</code>。实例还没有<code>x</code>属性,因此<code>self.x</code>的读取通过继承返回到类变量<code>SuperM.x == 0</code>,并将<strong>实例的</strong><code>x</code>设置为1。<code>SuperM.x</code>保持不变。你知道吗</p>
<p><code>Replacer().method()</code>-几乎相同的逻辑,读取<code>Super.x</code>返回到<code>SuperM.x == 0</code>,并将<strong>类变量</strong><code>Super.x</code>设置为2。你知道吗</p>
<p><code>Extender().method()</code>是指<code>Super.method()</code>尝试读取<code>self.x</code>,返回到读取<code>Super.x</code>(刚才设置为2),并将<strong>实例的</strong><code>self.x</code>设置为3。你知道吗</p>
<p>然后<code>provider.action()</code>被调用,尝试打印<code>self.x</code>,返回到读取<code>Super.x</code>并打印<code>2</code>。你知道吗</p>
<hr/>
<p>请注意,<code>Replacer.method</code>是唯一一个指定名为<code>x</code>的类变量的位置(除了开头)。此外,只修改实例<code>x</code>变量,并且实例是临时的,因此这些方法不做任何相关的事情。你知道吗</p>