<p>如果您可以控制<code>A</code>和<code>B</code></strong>的源代码,则任何一种方法(“新样式”或“旧样式”)都将有效。否则,可能需要使用适配器类</p>
<h3>可访问的源代码:正确使用“新样式”</h3>
<pre><code>class A(object):
def __init__(self):
print("-> A")
super(A, self).__init__()
print("<- A")
class B(object):
def __init__(self):
print("-> B")
super(B, self).__init__()
print("<- B")
class C(A, B):
def __init__(self):
print("-> C")
# Use super here, instead of explicit calls to __init__
super(C, self).__init__()
print("<- C")
</code></pre>
<pre><code>>>> C()
-> C
-> A
-> B
<- B
<- A
<- C
</code></pre>
<p>这里,方法解析顺序(MRO)规定了以下内容:</p>
<ul>
<li><code>C(A, B)</code>先指示<code>A</code>,然后<code>B</code>。MRO是<code>C -> A -> B -> object</code></李>
<li><code>super(A, self).__init__()</code>沿着在{<cd8>}到{<cd9>}中启动的MRO链继续</李>
<li><code>super(B, self).__init__()</code>沿着在{<cd8>}到{<cd12>}中启动的MRO链继续</李>
</ul>
<p>您可以说这个案例是为多重继承而设计的</p>
<h3>可访问的源代码:正确使用“旧样式”</h3>
<pre><code>class A(object):
def __init__(self):
print("-> A")
print("<- A")
class B(object):
def __init__(self):
print("-> B")
# Don't use super here.
print("<- B")
class C(A, B):
def __init__(self):
print("-> C")
A.__init__(self)
B.__init__(self)
print("<- C")
</code></pre>
<pre><code>>>> C()
-> C
-> A
<- A
-> B
<- B
<- C
</code></pre>
<p>在这里,MRO并不重要,因为<code>A.__init__</code>和<code>B.__init__</code>被显式调用<code>class C(B, A):</code>也同样有效</p>
<p>虽然这个案例并不像前一个案例那样为新样式中的多重继承“设计”,但多重继承仍然是可能的</p>
<hr/>
<p>现在,如果<code>A</code>和<code>B</code>来自第三方库,即,<strong>您无法控制<code>A</code>和<code>B</code></strong>的源代码,该怎么办?简短的回答是:您必须设计一个适配器类来实现必要的<code>super</code>调用,然后使用一个空类来定义MRO(请参见<a href="https://rhettinger.wordpress.com/2011/05/26/super-considered-super/" rel="noreferrer">Raymond Hettinger's article on ^{<cd20>}</a>-特别是“如何合并非协作类”一节)</p>
<h3>第三方家长:<code>A</code>未实现<code>super</code><code>B</code>确实</h3>
<pre><code>class A(object):
def __init__(self):
print("-> A")
print("<- A")
class B(object):
def __init__(self):
print("-> B")
super(B, self).__init__()
print("<- B")
class Adapter(object):
def __init__(self):
print("-> C")
A.__init__(self)
super(Adapter, self).__init__()
print("<- C")
class C(Adapter, B):
pass
</code></pre>
<pre><code>>>> C()
-> C
-> A
<- A
-> B
<- B
<- C
</code></pre>
<p>类<code>Adapter</code>实现<code>super</code>,以便<code>C</code>可以定义MRO,当执行<code>super(Adapter, self).__init__()</code>时,MRO将发挥作用</p>
<p>如果是另一种情况呢</p>
<h3>第三方父级:<code>A</code>实现<code>super</code><code>B</code>不</h3>
<pre><code>class A(object):
def __init__(self):
print("-> A")
super(A, self).__init__()
print("<- A")
class B(object):
def __init__(self):
print("-> B")
print("<- B")
class Adapter(object):
def __init__(self):
print("-> C")
super(Adapter, self).__init__()
B.__init__(self)
print("<- C")
class C(Adapter, A):
pass
</code></pre>
<pre><code>>>> C()
-> C
-> A
<- A
-> B
<- B
<- C
</code></pre>
<p>这里的模式相同,只是执行顺序在<code>Adapter.__init__</code>中切换<code>super</code>首先调用,然后是显式调用。请注意,具有第三方父级的每种情况都需要一个唯一的适配器类</p>
<blockquote>
<p>So it seems that unless I know/control the init's of the classes I inherit from (<code>A</code> and <code>B</code>) I cannot make a safe choice for the class I'm writing (<code>C</code>).</p>
</blockquote>
<p>虽然您可以通过使用适配器类来处理不<em>控制<code>A</code>和<code>B</code>的源代码的情况,但确实,您必须<em>了解父类的init如何实现<code>super</code>(如果有的话)</p>