Python super()参数:为什么不选择super(obj)?

Python super()参数:为什么不选择super(obj)?,第1张

Python super()参数:为什么不选择super(obj)?

仅在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,但那些总是不正常的情况下,更深奥的用途。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5630477.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存