Python 3中的超级()怪异

Age*_*uid 2 python super python-3.x

我知道之前已经讨论了很多次,但是从来没有对"引擎盖下"发生的事情做出任何解释.

任何人都可以提供一个详细的解释,为什么注释 - 在最后一行代码中引起错误?我知道那个对象.__ 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)
Run Code Online (Sandbox Code Playgroud)

小智 6

在Python 3中,每个方法都成为一个闭包,为定义的"当前类"添加了隐藏值.这可以通过super()(没有参数)访问.

Super返回一个使用类的Method Resolution Order(MRO)的对象,对于C实例,它在A之后有B.

如果没有在MRO中找到B,super().__init__在A中将调用object .__ init__,您无法传递任何参数.

您可以通过查看SomeClass .__ mro__来查看类的MRO.

虽然主要谈论2.x,但您可能需要阅读http://fuhm.net/super-harmful/.