Python多重继承中super()不调用构造函数

10 投票
2 回答
1624 浏览
提问于 2025-04-18 17:43

考虑以下代码:

class A(object):
    def __init__(self):
        pass
class B(object):
    def __init__(self):
        self.something = 'blue'
    def get_something(self):
        return self.something
class C(A,B):
    def __init__(self):
        super().__init__()
        print(self.get_something())

然后执行:

c = C()

这会产生类似这样的结果:

AttributeError: 'C' object has no attribute 'something'

我想这发生的原因是因为在使用 super() 时,B 的构造函数没有被调用。有没有办法在 Python 3 中实现正确的行为呢?

2 个回答

4

正如其他人提到的,方法解析顺序在这里非常重要。如果你想调用多个父类的构造函数,你可以直接调用它们。

class A(object):
    def __init__(self):
        pass
class B(object):
    def __init__(self):
        self.something = 'blue'
    def get_something(self):
        return self.something
class C(A,B):
    def __init__(self):
        A.__init__(self)
        B.__init__(self)
        print(self.get_something())
14

如果子类使用了super,那么父类也应该使用super。你可以在A和B里面加上 super().__init__() 这一行,这样你的例子就能正常工作了。

检查一下C的调用顺序:

>>> C.mro()
[__main__.C, __main__.A, __main__.B, builtins.object]

这篇文章可以帮助你更好地理解这个问题。

撰写回答