<p>只有在Python 2中才需要双参数形式。原因是<code>self.__class__</code>总是引用继承树中的“leaf”类——也就是对象的最特定类——但是当您调用<code>super</code>时,您需要告诉它当前正在调用哪个实现,以便它可以调用继承树中的下一个实现。</p>
<p>假设你有:</p>
<pre><code>class A(object):
def foo(self):
pass
class B(A):
def foo(self):
super(self.__class__, self).foo()
class C(B):
def foo(self):
super(self.__class__, self).foo()
c = C()
</code></pre>
<p>注意<code>c.__class__</code>总是<code>C</code>。现在想想如果您调用<code>c.foo()</code>会发生什么。</p>
<p>当您在C的方法中调用<code>super(self.__class__, self)</code>时,它将类似于调用<code>super(C, self)</code>,这意味着“调用C继承的此方法的版本”。这将调用<code>B.foo</code>,这很好。但是当你从B调用<code>super(self.__class__, self)</code>时,它仍然像调用<code>super(C, self)</code>,因为它是相同的<code>self</code>,所以<code>self.__class__</code>仍然是<code>C</code>。结果是,B中的调用将再次调用<code>B.foo</code>,并发生无限递归。</p>
<p>当然,您真正想要的是能够调用<code>super(classThatDefinedTheImplementationThatIsCurrentlyExecuting, self)</code>,这实际上就是Python 3<code>super()</code>所做的。</p>
<p>在Python 3中,您可以只做<code>super().foo()</code>,它会做正确的事情。我不清楚你说的<code>super(self)</code>是一条捷径是什么意思。在Python 2中,由于我上面描述的原因,它不能工作。在Python 3中,它将是一个“longcut”,因为您只需使用纯<code>super()</code>即可。</p>
<p>Python 3中偶尔仍需要使用<code>super(type)</code>和<code>super(type1, type2)</code>,但对于不寻常的情况,这些用法通常更为深奥。</p>