Is it possible in D's __init__
method, that I can call A, B, C's __init__
? The following D class only calls C's __init__
.
class A:
def __init__(self, a='a'):
print("Constructor A")
self.a = a
class B:
def __init__(self, b='b'):
print("Constructor B")
self.b = b
class C:
def __init__(self, c='c'):
print("Constructor C")
self.c = c
class D(C, B, A):
def __init__(self):
super().__init__()
def run(self):
return self.b
d = D()
print(d.run)
If you know all of the superclasses, you can call the methods explicitly.
class D(C, B, A):
def __init__(self):
A.__init__(self)
B.__init__(self)
C.__init__(self)
We can even automate this using __mro__
to get all superclasses.
class D(C, B, A):
def __init__(self):
for cls in self.__class__.__mro__[1:]:
cls.__init__(self)
MRO stands for "method resolution order". It's a list of all of the classes in the inheritance hierarchy for the given class, in the order super()
would see them. For your class D
, it's [D, C, B, A, object]
. We use [1:]
to eliminate D
from the list (as calling D.__init__
would cause infinite recursion).