擅长:python、mysql、java
<p>两种方法都很有效。使用<code>super()</code>的方法为子类带来了更大的灵活性。</p>
<p>在直接调用方法中,<code>C.__init__</code>可以同时调用<code>A.__init__</code>和<code>B.__init__</code>。</p>
<p>当使用<code>super()</code>时,类需要设计为协作多重继承,其中<code>C</code>调用<code>super</code>,调用<code>A</code>的代码,也调用<code>super</code>,调用<code>B</code>的代码。有关如何使用<code>super</code>执行操作的详细信息,请参见<a href="http://rhettinger.wordpress.com/2011/05/26/super-considered-super" rel="noreferrer">http://rhettinger.wordpress.com/2011/05/26/super-considered-super</a>。</p>
<p>[回答问题,稍后编辑]</p>
<blockquote>
<p>So it seems that unless I know/control the init's of the classes I
inherit from (A and B) I cannot make a safe choice for the class I'm
writing (C).</p>
</blockquote>
<p>引用的文章展示了如何通过在<code>A</code>和<code>B</code>周围添加包装类来处理这种情况。在题为“如何合并一个非合作类”的章节中有一个已经解决的例子。</p>
<p>有人可能希望多重继承更容易,让您轻松地组合汽车和飞机类以获得FlyingCar,但事实是,单独设计的组件通常需要适配器或包装器,然后才能像我们希望的那样无缝地装配在一起:-)</p>
<p>另一个想法是:如果您对使用多重继承组合功能不满意,可以使用组合来完全控制在哪些情况下调用哪些方法。</p>