<p>如果<code>Person</code>和{<cd2>}从来没有被设计成用作同一类的基类,那么{<cd3>}可能不应该存在。正确地设计多重继承是非常困难的,远不止调用<code>super</code>。即使是单一的继承也是相当棘手的。在</p>
<p>如果<code>Person</code>和<code>Horse</code><em>是</em>支持创建类的,那么<code>Person</code>和{<cd2>}(可能还有它们周围的类)需要重新设计。从这里开始:</p>
<pre><code>class Person:
def __init__(self, *, name, **kwargs):
super().__init__(**kwargs)
self.name = name
class Horse:
def __init__(self, *, fur_color, **kwargs):
super().__init__(**kwargs)
self.fur_color = fur_color
class Centaur(Person, Horse):
pass
stevehorse = Centaur(name="Steve", fur_color="brown")
</code></pre>
<hr/>
<p>你会注意到一些变化。让我们看看名单。在</p>
<P>第一,{{CD10}}签名在中间有一个^ {CD11}}。<code>*</code>标记仅关键字参数的开始:<code>name</code>和{<cd14>}现在都是关键字。当多重继承图中的不同类采用不同的参数时,几乎不可能让位置参数安全工作,因此为了安全起见,我们需要按关键字的参数。(如果多个类需要使用相同的构造函数参数,情况会有所不同。)</p>
<p>第二,<code>__init__</code>签名现在全部采用<code>**kwargs</code>。这使得<code>Person.__init__</code>接受它不理解的关键字参数,比如<code>fur_color</code>,并将它们传递给下一行,直到它们到达任何一个能理解它们的类。当参数到达<code>object.__init__</code>时,<code>object.__init__</code>应该接收到空的<code>kwargs</code>。在</p>
<p>第三,<code>Centaur</code>不再有自己的<code>__init__</code>。重新设计了<code>Person</code>和{<cd2>},它不需要<code>__init__</code>。从<code>Person</code>继承的<code>__init__</code>将正确处理<code>Centaur</code>的MRO,将<code>fur_color</code>传递给<code>Horse.__init__</code>。在</p>