仅在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__
是C
,始终。现在考虑如果您打电话给我会发生什么c.foo()
。
当您调用super(self.__class__, self)
C的方法时,它将类似于call super(C, self)
,这意味着“调用C继承的此方法的版本”。那会叫B.foo
,这很好。但是当您super(self.__class__, self)
从B呼叫时,它仍然像在呼叫super(C, self)
,因为它是相同的self
,所以self.__class__
仍然如此C
。结果是B中的调用将再次调用,B.foo
并且发生无限递归。
当然,您真正想要的是能够调用super(classThatDefinedTheImplementationThatIsCurrentlyExecuting, self)
,这实际上就是Python 3super()
所做的。
在Python 3中,您可以做,super().foo()
并且可以做正确的事。对我来说,你对super(self)
捷径的含义还不清楚。在Python 2中,由于上述原因,它不起作用。在Python 3中,这将是“ longcut”,因为您可以只使用Plain super()
。
该super(type)
和super(type1, type2)
用途可能仍然偶尔需要在Python 3,但那些总是不正常的情况下,更深奥的用途。