只有 Python 2 才需要双参数形式。原因是self.__class__
始终引用继承树中的“叶”类——即对象的最具体的类——但是当您调用super
您需要告诉它当前正在调用哪个实现,以便它可以调用继承树中的下一个实现。
假设您有:
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()
注意c.__class__
is C
, 总是。现在想想如果你打电话会发生什么c.foo()
.
你打电话时super(self.__class__, self)
在 C 的方法中,就像调用super(C, self)
,意思是“调用C继承的这个方法的版本”。那会调用B.foo
,这很好。但当你打电话时super(self.__class__, self)
来自B,仍然像打电话super(C, self)
,因为它是相同的self
, so self.__class__
还是C
。结果是B中的调用又会调用B.foo
并发生无限递归。
当然,你真正想要的是能够调用super(classThatDefinedTheImplementationThatIsCurrentlyExecuting, self)
,这实际上就是 Python 3 所做的super()
does.
在Python 3中,你可以这样做super().foo()
它做了正确的事。我不清楚你的意思super(self)
是一条捷径。在 Python 2 中,由于我上面描述的原因,它不起作用。在Python 3中,这将是一个“longcut”,因为你可以只使用简单的super()
反而。
The super(type)
and super(type1, type2)
在 Python 3 中偶尔可能仍然需要使用这些用法,但对于不寻常的情况,这些用法总是更加深奥。