Python3重新定义一个class:super还是调用oldclass

Python3 redefine a class: super still calls old class

此代码:

class a:
    def __init__(self):
        print("a here")

class b(a):
    def __init__(self):
        print("b here")
        super().__init__()

B = b()

class a:
    def __init__(self):
        print("NEW a here")

BB = b()

产生这个输出:

b here
a here
b here
a here

为什么?

如果我将 class b 中的 super().init() 更改为 a.init(self) , 它工作正常。

我认为这是因为 class b 仍然继承自您定义的原始 class a。 您可以通过打印出 a classes

的 ID 来检查这一点
id(a)
id(b.__bases__[0])

Class b 持有对其基数 class(es) 的引用。该引用是在创建 class 时创建的,而不是在稍后调用 super 时按名称查找。因此,您看到的“不正确”行为实际上是预期的行为。要更改 class b 视为其基础 class 的内容,您也需要重新定义 b