擅长:python、mysql、java
<p>您已经得到了一些关于为什么代码不起作用的答案(您正在创建一个新的<code>Employee</code>,而不是用自己的<code>self</code>调用<code>Employee</code>的方法),以及为什么通过<code>super</code>进行委托很方便(如果您更新父类,则不必更新所有代码)</p>
<p>另一个原因是Python支持<em>多重继承</em>,显式委托根本无法与<em>菱形继承</em>模式一起工作</p>
<p>菱形图案是这样的:</p>
<pre><code> A
/ \
/ \
B C
\ /
\ /
D
</code></pre>
<pre class="lang-py prettyprint-override"><code>class A:
def foo(self):
...
class B(A):
def foo(self):
...
class C(A):
def foo(self):
...
class D(C, B):
def foo(self):
...
</code></pre>
<p>“D”扩展了“B”和“C”,还覆盖了“foo”以添加自己的内容。“D”不能只调用“B::foo”和“C::foo”:如果它这样做,那么<em>两个</em>都会依次调用“A::foo”,如果它有危险的副作用,则会调用两次</p>
<p>如果您使用<code>super()</code>,那么Python将使用<em>方法解析顺序</em>(特别是<a href="https://en.wikipedia.org/wiki/C3_linearization" rel="nofollow noreferrer">C3</a>)管理链:创建类时,它将生成所有父类的<em>线性</em>序列,调用<code>super()</code>时,它只需从该序列开始遍历,以找到“父”方法,甚至在完全不相关的类之间</p>
<p>这里的MRO是D->;C->;B->;A、 因此,当<code>D</code>调用<code>super().foo()</code>时,Python将调用<code>C::foo</code>,其超级将调用<code>B::foo</code>*尽管C和B彼此不了解</p>