<p>Python中的多重继承需要协作。也就是说,两个父类需要知道彼此存在的可能性(尽管它们不需要知道彼此的任何细节)。然后,无论哪个父级先被命名,都可以调用另一个父级的<code>__init__</code>方法。这就是<code>super</code>的工作方式,它总是调用被操作实例的MRO(方法解析顺序)中的下一个类。你知道吗</p>
<p>您的代码很难正确执行此操作,因为您总是在<code>super</code>调用中传递完整的<code>kwargs</code>dict。当第二个父级试图调用MRO中的最后一个类<code>object</code>时,这就成了一个问题,这个类不希望接收任何关键字参数。相反,每个类的<code>__init__</code>方法通常应该显式地命名它所期望的参数,并且在调用<code>super().__init__</code>时不要再次传递这些参数(除非它知道它的一个父类也需要参数)。你知道吗</p>
<p>试试这个:</p>
<pre><code>class Father:
def __init__(self, ffn, fln, fa, **kwargs): # name the parameters we expect
super().__init__(**kwargs) # pass on any unknown arguments
self.fathername = ffn + " " + fln # use parameters by name, rather than via kwargs
self.fatherage = fa
class Mother:
def __init__(self, mfn, mln, ma, **kwargs):
super().__init__(**kwargs)
self.mothername = mfn + " " + mln
self.motherage = ma
class Child(Father, Mother):
def __init__(self, name, lastname, age, **kwargs):
super().__init__(**kwargs)
self.name = name " " + lastname
self.age = age
def __str__(self):
return \
"Im {}, {} years old".format(self.name, self.age) + "\n" + \
"My dad is {} and he is {} years old".format(self.fathername, self.fatherage) + "\n" + \
"My mom is {} and she is {} years old".format(self.mothername, self.motherage)
familyname = "Simpson"
child = Child(name="Bart", lastname=familyname, age=15, # you can use keyword syntax here
ffn="Homer", fln=familyname, fa=54,
mfn="Marge", mln=familyname, ma=46)
print(child)
</code></pre>
<p>请注意,在python3中,通常不需要向<code>super()</code>传递任何参数,它可以确定从哪个类调用它并自动工作。在Python2中,您必须指定当前类,但这不再需要了。你知道吗</p>
<p>最后一个音符。虽然我确信你的代码只是一个例子,但在面向对象设计方面,类的名称是非常糟糕的。继承意味着这两个类之间存在一种<em>IS-A</em>关系,这实际上并不适合人。例如,在示例代码(Bart)中创建的子级不是<code>Mother</code>或<code>Father</code>,但是代码说他是,因为他是<code>Mother</code>和<code>Father</code>类的实例。描述与父母之间人际关系的更好方法是HAS-A</em>。每个孩子都有一个母亲和一个父亲。您可以使用封装来建立<em>HAS-A</em>关系。这意味着,子对象对属性中每个父对象都有一个引用。有趣的是,只需一节课就可以做到这一点(这可能就是为什么你没有学习这一点,如果你被教导继承的话):</p>
<pre><code>class Person:
def __init__(self, firstname, lastname, age, father=None, mother=None):
self.name = firstname + " " + lastname
self.age = age
self.father = father # set the attributes for our parents here
self.mother = mother
fn = "Simpson"
bart = Person("Bart", fn, 15, Person("Homer", fn, 54), Person("Marge", fn, 46))
</code></pre>