pythonmultiple-inheritancesuperdiamond-problem

python multiple inheritance passing arguments to constructors using super


Consider the following snippet of python code

class A(object):
    def __init__(self, a):
        self.a = a

class B(A):
    def __init__(self, a, b):
        super(B, self).__init__(a)
        self.b = b

class C(A):
    def __init__(self, a, c):
        super(C, self).__init__(a)
        self.c = c

class D(B, C):
    def __init__(self, a, b, c, d):
        #super(D,self).__init__(a, b, c) ???
        self.d = d

I am wondering how can I pass a, b and c to corresponding base classes' constructors.


Solution

  • Well, when dealing with multiple inheritance in general, your base classes (unfortunately) should be designed for multiple inheritance. Classes B and C in your example aren't, and thus you couldn't find a proper way to apply super in D.

    One of the common ways of designing your base classes for multiple inheritance, is for the middle-level base classes to accept extra args in their __init__ method, which they are not intending to use, and pass them along to their super call.

    Here's one way to do it in python:

    class A(object):
        def __init__(self,a):
            self.a=a
    
    class B(A):
        def __init__(self,b,**kw):
            self.b=b
            super(B,self).__init__(**kw)
    
     class C(A):
        def __init__(self,c,**kw):
            self.c=c
            super(C,self).__init__(**kw)
    
    class D(B,C):
        def __init__(self,a,b,c,d):
            super(D,self).__init__(a=a,b=b,c=c)
            self.d=d
    

    This can be viewed as disappointing, but that's just the way it is.