您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

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

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

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

python 2022/1/1 18:44:08 有288人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶