<p>我想分享一些关于这个问题的看法。在</p>
<p>如果要重写父类的<code>get_dough()</code>方法,则可能无法调用<code>self.get_dough()</code>,如下所示:</p>
<pre><code>class AbdullahStore(DoughFactory):
def get_dough(self):
return 'Abdullah`s special ' + super().get_dough()
</code></pre>
<p>我认为这是实践中经常出现的情况。如果我们直接调用<code>DoughFactory.get_dough(self)</code>,那么行为是固定的。派生<code>AbdullahStore</code>的类必须重写
完整方法,无法重用<code>AbdullahStore</code>的“附加值”。另一方面,如果我们使用<code>super.get_dough(self)</code>,这有一种模板的味道:
在从<code>AbdullahStore</code>派生的任何类中,例如</p>
^{pr2}$
<p>我们可以用不同的方式“实例化”<code>AbdullahStore</code>中使用的<code>get_dough()</code>,方法是在MRO中截取它</p>
<pre><code>class OrganicKebab(Kebab, OrganicDoughFactory):pass
</code></pre>
<p>它的作用是:</p>
<pre><code>Kebab().order_kebab('spicy')
Making kebab with Abdullah`s special insecticide treated wheat dough and spicy sauce
OrganicKebab().order_kebab('spicy')
Making kebab with Abdullah`s special pure untreated wheat dough and spicy sauce
</code></pre>
<p>由于<code>OrganicDoughFactory</code>有一个单亲的<code>DoughFactory</code>,因此它被保证插入到MRO中<code>DoughFactory</code>之前,并因此覆盖MRO中所有前面类的方法。我花了一些时间来理解用于构造MRO的C3线性化算法。
问题是这两条规则</p>
<pre><code>children come before parents
parents order is preserved
</code></pre>
<p>根据这个引用<a href="https://rhettinger.wordpress.com/2011/05/26/super-considered-super/" rel="nofollow noreferrer">https://rhettinger.wordpress.com/2011/05/26/super-considered-super/</a>不要明确地定义顺序。在类层次结构中</p>
<pre><code>D->C->B->A
\ /
E
</code></pre>
<p>(A类;B(A)类;C(B)类;E(A)类;D(C、E)类),其中E将插入MRO中?是DCBEA还是DCEBA?也许在你可以自信地回答这样的问题之前,开始在各处插入<code>super</code>并不是一个好主意。我还不完全确定,但我认为C3线性化,它是不含糊的,在这个例子中将选择DCBEA排序
让我们用我们做拦截的方式,毫不含糊。在</p>
<p>现在,我想你可以预测</p>
<pre><code>class KebabNPizza(Kebab, OrganicPizza): pass
KebabNPizza().order_kebab('hot')
</code></pre>
<p>这是一种改良的烤肉串:</p>
<pre><code>Making kebab with Abdullah`s special pure untreated wheat dough and hot sauce
</code></pre>
<p>但你可能花了一些时间来计算。在</p>
当我第一次看到了一个弱的前^ ^ <CD13>} DOC<a href="https://docs.python.org/3.5/library/functions.html?highlight=super#super" rel="nofollow noreferrer">https://docs.python.org/3.5/library/functions.html?highlight=super#super</a>,它来自C++背景,它就像“哇,好吧,这里有规则,但是它怎么能工作,而不是在后面把你钉死?”
现在我对它有了更多的了解,但是仍然不愿意到处插入<code>super</code>。{I{I>认为基类的{16>比基类更方便。
这甚至不是说在链接<code>super()</code>函数时<code>super()</code>的极端使用。我在实践中观察到的是,每个人都用对类(而不是通用类)方便的签名编写构造函数,并使用<code>super()</code>来调用他们认为是基类构造函数的东西。在</p>