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
。
此代码:
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
。