Inheriting more than 1 parent class in python

Question:

I am trying to inherit 2 classes as parent class in a child class both have different class variables class A has a,b while class B has c,d,e they are the parent to class AB(A,B) now i want to make an object of AB class but i am not able understand how to pass the value while i try to create an object of AB class

class A:
    def __init__(self,a,b):
        self.a = a
        self.b = b
    def testa(self):
        print('inside A')
class B:
    def __init__(self,c,d,e):
        self.c = c
        self.d = d
        self.e = e
    def testb(self):
        print('inside B')

class AB(A,B):
    def __init__(self,*args):
        A.__init__(self,*args)
        B.__init__(self,*args)

obj = AB(1,2,3) # this is throwing error

Asked By: Shashank Tripathi

||

Answers:

This is happening because you are calling the __init__ method of the A and B classes with the *args argument, which is causing all the arguments to be passed as a single tuple.
To fix this, you can define the __init__ method in the AB class and accept the values for the variables as separate arguments, like this:

class AB(A,B):
    def __init__(self, a, b, c, d, e):
        A.__init__(self, a, b)
        B.__init__(self, c, d, e)

now you can pass the values like this:

obj = AB(1, 2, 3, 4, 5)
Answered By: Phoenix

*args will always unpack all values. And as A only expects 2 values it throws an error, when you pass 3 values. To limit args to 2 elements use slicing [:2] if you want to pass the first 2 elements to A

So your AB‘s init should look like this:

class AB(A,B):
    def __init__(self, *args):
        A.__init__(self, *args[:2])
        B.__init__(self, *args)

Additionally, you’ll run into an error with your methods testa and testb as they are missing self which is always passed to methods of an instance.

Just add self to both methods to avoid a TypeError

def testa(self):
        print('inside A')
Answered By: Wolric