Python 3 中 super() 的奇怪行为

2 投票
1 回答
891 浏览
提问于 2025-04-15 18:00

我知道这个问题之前讨论过很多次,但从来没有人详细解释过背后的原因。

有没有人能详细说明一下,为什么把最后一行代码注释掉会导致错误?我知道 object.__init__ 这个方法不需要任何参数,但为什么当这一行被注释掉时,代码就能正常运行呢?

class A:
   def __init__(self, a):
      print("A constructor")
      super().__init__(a)
      self.a = a
      print("A constructor end")

class B:
   def __init__(self, b):
      print("B constructor")
      super().__init__()
      self.b = b
      print("B constructor end")


class C(A, B):
   def __init__(self, x):
      super().__init__(x)


c = C(42)
#a = A(33)

1 个回答

6

在Python 3中,每个方法都会变成一个闭包,并且会自动添加一个隐藏的值,这个值代表“当前正在定义的类”。你可以通过super()(不带任何参数)来访问这个值。

super会返回一个对象,这个对象会根据类的方法解析顺序(MRO)来工作。对于C类的实例来说,MRO中是先有A再有B。

如果在MRO中找不到B,那么在A中使用super().__init__时,会调用object.__init__,而这个方法不能接收任何参数。

你可以通过查看SomeClass.__mro__来查看一个类的MRO。

虽然大部分内容是关于2.x版本的,你可能还想看看这个链接:http://fuhm.net/super-harmful/

撰写回答