回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我有两个超类,父亲和母亲,他们将由孩子继承。你知道吗</p>
<pre><code>class Father:
def __init__(self, **kwargs):
self.fathername = kwargs["ffn"] + " " + kwargs["fln"]
self.fatherage = kwargs["fa"]
class Mother:
def __init__(self, **kwargs):
self.mothername = kwargs["mfn"] + " " + kwargs["mln"]
self.motherage = kwargs["ma"]
</code></pre>
<p>这个班的孩子继承自父母</p>
<pre><code>class Child(Father, Mother):
def __init__(self, **kwargs):
self.name = kwargs["name"] + " " + kwargs["lastname"]
self.age = kwargs["age"]
</code></pre>
<p>如果我分别调用他们的<code>__init__()</code>,我可以初始化父亲和母亲。你知道吗</p>
<pre><code> Father.__init__(self, **kwargs)
Mother.__init__(self, **kwargs)
</code></pre>
<p>但是如何使用super()实现同样的效果呢?如果我像下面这样称呼它,它只初始化父亲而不是母亲(因为父亲是MRO中的下一个)</p>
<pre><code> super().__init__(**kwargs)
</code></pre>
<p>下面是被覆盖的<code>__str__()</code>,以显示分配的内容。你知道吗</p>
<pre><code>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, "ffn": "Hommer", "fln": familyname, "fa": 54, "mfn": "Marggie", "mln": familyname, "ma": 46})
</code></pre>
<p>当我尝试打印对象时,它将失败,因为母超类从未初始化(当我在子类中使用<code>__init__()</code>时)</p>
<pre><code>print(child)
The program raises a runtime error
Traceback (most recent call last):
File "/tmp/pyadv.py", line 225, in <module>
print(child)
File "/tmp/pyadv.py", line 217, in __str__
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)
AttributeError: 'Child' object has no attribute 'mothername'
</code></pre>
<p>那么,如何使用super初始化两个超类呢?你知道吗</p>
<p>编辑:
我试图将<code>super(Father, self).__init__(**kwargs)</code>和<code>super(Mother, self).__init__(**kwargs)</code>添加到超类<code>__init__()</code>方法,但出现以下错误:</p>
<pre><code>Traceback (most recent call last):
File "/tmp/pyadv.py", line 225, in <module>
child = Child(**{"name": "Bart", "lastname": familyname, "age": 15, "ffn": "Hommer", "fln": familyname, "fa": 54, "mfn": "Marggie", "mln": familyname, "ma": 46})
File "/tmp/pyadv.py", line 217, in __init__
super().__init__(**kwargs)
File "/tmp/pyadv.py", line 199, in __init__
super(Father, self).__init__(**kwargs)
File "/tmp/pyadv.py", line 208, in __init__
super(Mother, self).__init__(**kwargs)
TypeError: object.__init__() takes no parameters
</code></pre>
<p>我还尝试将<code>super(Father, self).__init__()</code>和<code>super(Mother, self).__init__()</code>(在<code>__init__()</code>内没有参数)添加到超类<code>__init__()</code>方法中,但出现以下错误:</p>
<pre><code>Traceback (most recent call last):
File "/tmp/pyadv.py", line 225, in <module>
child = Child(**{"name": "Bart", "lastname": familyname, "age": 15, "ffn": "Hommer", "fln": familyname, "fa": 54, "mfn": "Marggie", "mln": familyname, "ma": 46})
File "/tmp/pyadv.py", line 217, in __init__
super().__init__(**kwargs)
File "/tmp/pyadv.py", line 199, in __init__
super(Father, self).__init__()
File "/tmp/pyadv.py", line 206, in __init__
self.mothername = kwargs["mfn"] + " " + kwargs["mln"]
KeyError: 'mfn'
</code></pre>
<p>解决方案1:
@blkkngt从下面剥离</p>
<p>解决方案2:
根超类,详细的<a href="https://rhettinger.wordpress.com/2011/05/26/super-considered-super/" rel="nofollow noreferrer">here</a>。你知道吗</p>
<pre><code>class Root:
def __init__(self, **kwargs):
pass
class Father(Root):
def __init__(self, **kwargs):
self.fathername = kwargs["ffn"] + " " + kwargs["fln"]
self.fatherage = kwargs["fa"]
super().__init__(**kwargs)
class Mother(Root):
def __init__(self, **kwargs):
self.mothername = kwargs["mfn"] + " " + kwargs["mln"]
self.motherage = kwargs["ma"]
super().__init__(**kwargs)
class Child(Father, Mother):
def __init__(self, **kwargs):
self.name = kwargs["name"] + " " + kwargs["lastname"]
self.age = kwargs["age"]
super().__init__(**kwargs)
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, "ffn": "Homer", "fln": familyname, "fa": 54, "mfn": "Marge", "mln": familyname, "ma": 46})
print(child)
</code></pre>