从内置类型以及其他类派生时,似乎内置类型的构造函数不调用超类构造函数。这导致 __init__ 方法不会被 MRO 中内置函数之后的类型调用。
例子:
class A:
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
print("A().__init__()")
class B(list, A):
def __init__(self, *args, **kwargs):
print("B().__init__() start")
super().__init__(*args, **kwargs)
print("B().__init__() end")
if __name__ == '__main__':
b = B()
在此示例中,从未调用 A.__init__。当 B 被定义为class B(A, list)
——切换继承顺序——它按预期工作(即 A.__init__ 被调用)。
这种对继承顺序的非常微妙的依赖似乎相当不符合pythonic,是这样打算的吗?这也意味着您绝不能从复杂类层次结构中的内置类型派生,因为当其他人从您的类派生时,您无法知道内置类型在 MRO 中的最终位置(维护恐惧)。我错过了什么吗?
额外信息:Python 3.1 版