Multiple
inheritance is possible in Python unlike other programming languages. A
class can be derived from more than one base classes. The syntax for
multiple inheritance is similar to single inheritance.
The class
MRO of a class can be viewed as the
Output
Python Multiple Inheritance Example
class Base1:
pass
class Base2:
pass
class MultiDerived(Base1, Base2):
pass
The class
MultiDerived
inherits from both Base1
and Base2
.Multilevel Inheritance in Python
On the other hand, we can inherit form a derived class. This is also called multilevel inheritance. Multilevel inheritance can be of any depth in Python. An example with corresponding visualization is given below.
class Base:
pass
class Derived1(Base):
pass
class Derived2(Derived1):
pass
Method Resolution Order in Python
Every class in Python is derived from the classobject
.
It is the most base type in Python. So technically, all other class,
either built-in or user-defines, are derived classes and all objects are
instances of object
class.
>>> issubclass(list,object)
True
>>> isinstance(5.5,object)
True
>>> isinstance("Hello",object)
True
In the multiple inheritance scenario, any specified attribute is
searched first in the current class. If not found, the search continues
into parent classes in depth-first, left-right fashion without searching
same class twice. So, in the above example of MultiDerived
class the search order is [MultiDerived
, Base1
, Base2
, object
]. This order is also called linearization of MultiDerived
class and the set of rules used to find this order is called Method
Resolution Order (MRO). MRO must prevent local precedence ordering and
also provide monotonicity. It ensures that a class always appears before
its parents and in case of multiple parents, the order is same as tuple
of base classes.MRO of a class can be viewed as the
__mro__
attribute or mro()
method. The former returns a tuple while latter returns a list.
>>> MultiDerived.__mro__
(<class '__main__.MultiDerived'>,
<class '__main__.Base1'>,
<class '__main__.Base2'>,
<class 'object'>)
>>> MultiDerived.mro()
[<class '__main__.MultiDerived'>,
<class '__main__.Base1'>,
<class '__main__.Base2'>,
<class 'object'>]
Here is a little more complex multiple inheritance example and its visualization along with the MRO.
class X: pass
class Y: pass
class Z: pass
class A(X,Y): pass
class B(Y,Z): pass
class M(B,A,Z): pass
print(M.mro())
Output
[<class '__main__.M'>, <class '__main__.B'>, <class '__main__.A'>, <class '__main__.X'>, <class '__main__.Y'>, <class '__main__.Z'>, <class 'object'>]
Refer to this, for further discussion on MRO and to know the actual algorithm how it is calculated.
No comments:
Post a Comment