Python multiple inheritance constructor not called

2019-02-26 02:21发布

Consider the following code:

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())

and then do:

c = C()

which results in something like this:

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

I suppose this happens due to the constructor of B not being called when using super(). Is there a way to achieve the correct behavior with Python 3?

2条回答
Root(大扎)
2楼-- · 2019-02-26 02:33

As others have mentioned, the method resolution order is key here. If you want to call multiple superclass constructors, then you will have to call them directly.

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())
查看更多
我欲成王,谁敢阻挡
3楼-- · 2019-02-26 02:50

Superclasses should use super if their subclasses do. If you add the super().__init__() line into A and B your example should work again.

Check the method resolution order of C:

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

This article should clear things up.

查看更多
登录 后发表回答