2

我知道这已经讨论过很多次了,但从来没有解释过“幕后”发生了什么。

任何人都可以详细解释为什么在最后一行代码中注释会导致引发错误吗?我知道那个 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)
4

1 回答 1

6

在 Python 3 中,每个方法都成为一个闭包,并为正在定义的“当前类”添加了一个隐藏值。这是由super()(不带参数)访问的。

Super 返回一个使用类的方法解析顺序 (MRO) 的对象,对于 C 实例,它在 A 之后有 B。

如果没有在 MRO 中找到 B,super().__init__在 A 中将调用 object.__init__,您不能向其传递任何参数。

您可以通过查看 SomeClass.__mro__ 来查看课程的 MRO。

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

于 2010-01-13T21:45:34.013 回答