仅在Python
2中才需要两个参数的形式。其原因是,它
self.__class__总是引用继承树中的“叶子”类(即对象的最特定类),但是调用
super时需要告诉它是当前正在调用的实现,因此它可以在继承树中调用下一个实现。
假设您有:
class A(object): def foo(self): passclass 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 3
super()所做的。
在Python 3中,您可以做,
super().foo()并且可以做正确的事。对我来说,你对
super(self)捷径的含义还不清楚。在Python
2中,由于上述原因,它不起作用。在Python 3中,这将是“ longcut”,因为您可以只使用Plain
super()。
该
super(type)和
super(type1, type2)用途可能仍然偶尔需要在Python 3,但那些总是不正常的情况下,更深奥的用途。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)