擅长:python、mysql、java
<p><code>super()</code>的思想是,您不必费心分别调用两个超类<code>__init__()</code>方法——只要您正确使用它,<code>super()</code>就会处理它——请参阅<a href="http://rhettinger.wordpress.com/2011/05/26/super-considered-super/" rel="noreferrer">Raymond Hettinger's "Python’s super() considered super!"</a>以获取解释。</p>
<p>也就是说,我经常发现构造函数调用的<code>super()</code>的缺点大于优点。例如,所有构造函数都需要提供一个附加的<code>**kwargs</code>参数,所有类都必须协作,非协作的外部类需要一个包装器,您必须注意每个构造函数参数名称在类之间都是唯一的,等等</p>
<p>因此,我认为更容易显式地命名要为构造函数调用调用的基类方法:</p>
<pre><code>class Child(Parent1, Parent2):
def __init__(self):
Parent1.__init__(self)
Parent2.__init__(self)
</code></pre>
<p>不过,对于有保证原型的函数,比如<code>__getattr__()</code>,我确实使用<code>super()</code>。在这些情况下没有缺点。</p>