When a class inherits from more than one class, it’s called multiple inheritances. Python supports multiple inheritances whereas Java doesn’t support it. The properties of all the super/base classes are inherited into the derived/subclass.
Python Multiple Inheritance Syntax
The syntax for Multiple Inheritance is also similar to the single inheritance. By the way, the derived class claims the properties and methods of all the base classes.
class Base1: pass class Base2: pass class MultiDerived(Base1, Base2): pass
Python Multiple Inheritance Example
# first parent class class Manager(object): def __init__(self, name, idnumber): self.name = name self.idnumber = idnumber # second parent class class Employee(object): def __init__(self, salary, post): self.salary = salary self.post = post # inheritance from both the parent classes class Person(Manager, Employee): def __init__(self, name, idnumber, salary, post, points): self.points = points Manager.__init__(self, name, idnumber) Employee.__init__(self, salary, post) print(self.salary) ins = Person('Rahul', 882016, 75000, 'Assistant Manager', 560)
Multiple resolution order
Method Resolution Order (MRO) is an approach that takes to resolve the variables or functions of a class.
- In the multiple inheritance use case, the attribute is first looked up in the current class. If it fails, then the next place to search is in the parent class.
- If there are multiple parent classes, then the preference order is depth-first followed by a left-right path.
- MRO ensures that a class always precedes its parents and for multiple parents, keeps the order as the tuple of base classes and avoids ambiguity.
Example to explain MRO
class Agile: def create(self): print(" Forming class Agile") class Dev(Agile): def create(self): print(" Forming class Dev") class QA(Agile): def create(self): print(" Forming class QA") # Ordering of classes class Sprint(Dev, QA): pass sprint = Sprint() sprint.create()
Output: Forming class Dev
Methods For Method Resolution Order(MRO)
Python provides a __mro__ attribute and the mro() method. With these, you can get the resolution order.
class Material: def create(self): print(" Creating class Appliance") class Pencil: def create(self): print(" Creating class Pencil") # Order of classes class Pen(Material, Pencil): def __init__(self): print("Constructing Pen") appl = Pen() # Display the lookup order print(Pen.__mro__) print(Pen.mro())
Constructing Pen (<class '__main__.Pen'>, <class '__main__.Material'>, <class '__main__.Pencil'>, <class 'object'>) [<class '__main__.Pen'>, <class '__main__.Material'>, <class '__main__.Pencil'>, <class 'object'>]