Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python multiple inheritance constructor not called when using super()

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?

like image 241
Stefan Avatar asked Aug 18 '14 21:08

Stefan


2 Answers

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.

like image 63
wim Avatar answered Sep 20 '22 23:09

wim


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())
like image 20
Andrew Johnson Avatar answered Sep 21 '22 23:09

Andrew Johnson