Python Multiple Inheritance
Python Multiple Inheritance
Like in C++, in Python, a class can be derived from more than one class. This is called multiple inheritance.
When using multiple inheritance, the features of all parent (base) classes are inherited into the child (derived) class.
Python Multiple Inheritance Syntax
The syntax for multiple inheritance can be given as follows:
class Base1:
pass
class Base2:
pass
class Derived(Base1, Base2):
pass
As we can see above, the Derived class inherits from Base1 and Base2 classes.
The Derived class is derived from both Base1 and Base2 classes.
Python Multilevel Inheritance
Multilevel inheritance can be done by inheriting from a derived class. It can be of any depth in Python.
When using multilevel inheritance, features of the base class and the derived class are further inherited into the new derived class.
Let us see an example of multilevel inheritance.
class GrandFather:
pass
class Father(GrandFather):
pass
class Son(Father):
pass
Here, the Father class is derived from the GrandFather class, and the Son class is derived from the Father class.
The following illustration gives a more detailed picture of multilevel inheritance.
Method Resolution Order in Python
In Python, every class is a subclass from the object class. So all classes, either built-in or user-defined, are derived classes, and all objects are instances of the object class.
print(issubclass(int, object))
print(isinstance("hello world", object))
print(isinstance(33, object))
Output
True
True
True
Method Resolution Order (MRO) is the way a programming language resolves a method or attribute.
In the multiple inheritance scenario, the method resolution order consists of searching for any specified attribute first in the current class. If not found, the search continues into parent classes in depth-first, left-right without searching the same class twice.
So, in the above example of the Derived class the search order is [Derived, Base1, Base2, object]. This order is known as a linearization of the Derived class.
MRO prevents local priority ordering and provides monotonicity. It ensures that a class always appears before its parents. If a class inherits from multiple classes, they are put in the same order specified in the tuple of the base class.
To view the MRO of a class, we can use the __mro__ or the mro() method. The first one returns a tuple, while the second returns a list.
>>> Derived.__mro__
(<class '__main__.Derived'>, <class '__main__.Base1'>, <class '__main__.Base2'>, <class 'object'>)
>>> Derived.mro()
[<class '__main__.Derived'>, <class '__main__.Base1'>, <class '__main__.Base2'>, <class 'object'>]
We will see a more complex multiple inheritance example and its illustration with the MRO in the following example.
class A:
pass
class B:
pass
class C:
pass
class M(A, B):
pass
class N(B, C):
pass
class X(M, N, A):
pass
print(M.mro())
Output
[<class '__main__.M'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>]
