<p>为了澄清一下,根据<code>Pizza.order_pizza</code>中的第二行和{<cd2>}的定义,有四种情况:</p>
<ol>
<li><code>super()</code>,<code>(Pizza, OrganicDoughFactory)</code><em>(原始)</em>:<code>'Making pie with pure untreated wheat dough'</code></li>
<li><code>self</code>,<code>(Pizza, OrganicDoughFactory)</code>:<code>'Making pie with pure untreated wheat dough'</code></li>
<li><code>super()</code>,<code>(OrganicDoughFactory, Pizza)</code>:<code>'Making pie with insecticide treated wheat dough'</code></li>
<li><code>self</code>,<code>(OrganicDoughFactory, Pizza)</code>:<code>'Making pie with pure untreated wheat dough'</code></li>
</ol>
<p>案例3。是让您感到惊讶的一个;如果我们切换继承顺序但仍然使用<code>super</code>,显然我们最终调用了原始的<code>DoughFactory.get_dough</code>。在</p>
<hr/>
<p><code>super</code>真正做的是问<em>“MRO(方法解析顺序)中的下一个?”那么<code>OrganicPizza.mro()</code>是什么样子的呢?在</p>
<ul>
<li><code>(Pizza, OrganicDoughFactory)</code>:<code>[<class '__main__.OrganicPizza'>, <class '__main__.Pizza'>, <class '__main__.OrganicDoughFactory'>, <class '__main__.DoughFactory'>, <class 'object'>]</code></li>
<li><code>(OrganicDoughFactory, Pizza)</code>:<code>[<class '__main__.OrganicPizza'>, <class '__main__.OrganicDoughFactory'>, <class '__main__.Pizza'>, <class '__main__.DoughFactory'>, <class 'object'>]</code></li>
</ul>
<p>这里的关键问题是:哪个在</em>^{<cd23>之后出现?当我们从<code>Pizza</code>内部调用<code>super</code>时,Python将在这里找到<code>get_dough</code>*。为1。和2。它是<code>OrganicDoughFactory</code>,所以我们得到了纯的,未经处理的面团,但是3块。和4。它是原始的,杀虫剂处理过的。在</p>
<hr/>
<p>那么<code>self</code>为什么不同呢?<code>self</code>总是<em>实例</em>,因此Python从MRO开始就开始寻找<code>get_dough</code>。在这两种情况下,如上所示,<code>OrganicDoughFactory</code>在列表中比<code>DoughFactory</code>早,这就是为什么<code>self</code>版本总是<em>总是</em>得到未处理的面团;<code>self.get_dough</code>总是解析为<code>OrganicDoughFactory.get_dough(self)</code>。在</p>
<hr/>
<p>*<em>我认为在Python2.x中使用的<code>super</code>这两个参数的形式实际上更清楚,它是<code>super(Pizza, self).get_dough()</code>;第一个参数是要跳过的类(即Python在MRO的其余部分中查找该类之后)。</em></p>