Python Multiple Inheritance

    In this tutorial, we will discuss Python multiple inheritance and also code a program for it. We will also learn the multi-level inheritance.

    Multiple Inheritance in Python

    Multiple inheritance is a concept of Inheritance in which a derived class can inherit from more than one Base class. It is a very powerful property of inheritance and comes very handy when we work on a big project, with the help of Multiple inheritance a class can inherit more than one base class.

    Syntax

    class base_1:
        #base_1 block
    class base_2:
        # base_2 block
    class derived(base_2, base_1):
        #base derived block

    Multiple inheritance example

    class Boy: 
        def __init__(self):
            super().__init__()
            self.boy_Name= "John"
        def get_boy_Name(self): 
            return self.boy_Name 
    class Girl: 
        def __init__(self):
            super().__init__()
            self.girl_name="Richa"
        def get_girl_Name(self): 
            return self.girl_name 
    class Call(Boy, Girl): 
        def __init__(self): 
            super().__init__() 
    C1 = Call() 
    print(C1.get_boy_Name())
    print(C1.get_girl_Name())

    #Output

    John
    Richa

    Behind the Code

    Here in the above example, we have used super() . __init__() function to initialize all the classes at once. And like inheritance in multiple inheritance, we have used the derived class to access it’s all base classes functions.

    Multi-Level Inheritance

    Multi-inheritance is similar as Multiple inheritances but the only difference is, in Multiple inheritance this is only one derive class to inherit from multiple base classes but in Multi-level inheritance a derive class inherit from another derived class.

    Multi-level Inheritance Syntax

    class base:
        # base class
    class derived_1(base):
        # first derived class
    class derived_2(derived_1):
        # inheriting from derived class

    Method Resolution Order

    Method of Resolution also known as MRO it describes the behavior of the child class object, and tell in which order the child class object will call the parent class methods and attributes.

    Example

    class B:
        def b(self):
            print('b')
        def k(self):
            print("b's k")
    class C:
        def c(self):
            print('c')
        def k(self):
            print("c's k")
    class D(B, C):
        def d(self):
            print('d')
    d = D()
    d.b()
    d.c()
    d.d()
    d.k()

    #Output

    b
    c
    d
    b's k

    Behind the code

    In the above example, we inherit class B and C in class D, and when we create the object of class D so, we get the authority to call the methods of B and C using the D object because we have inherited them. You can see that B and C both contain a method with the same name k(self), printing different outputs but when we use the D object and call that k() method, only the Class B method gets executed not class C why? This is because of MRO (method resolution order). When we call d.k(), the object first search the method k() in its own class which is class D then it went to class B and there it finds k() method. What if class B did not have method k() ? then the object d would look in class C for it. What if class B and C both did not have method k() . the object d would start to look in python built-in methods and if the Python built-in method did not have k() method then it would throw an error.