使用 super() 时未调用 Python 多重继承构造函数

问题描述 投票:0回答:2

考虑以下代码:

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 实现正确的行为?

python oop inheritance python-3.x multiple-inheritance
2个回答
14
投票

如果子类使用 super,则超类也应该使用 super。如果您将

super().__init__()
行添加到 A 和 B 中,您的示例应该会再次运行。

检查C:的方法解析顺序

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

这篇文章应该可以澄清问题。


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())
© www.soinside.com 2019 - 2024. All rights reserved.