Python Tutorial
Python Variable
Python Operators
Python Sequence
Python String
Python Flow Control
Python Functions
Python Class and Object
Python Class Members (properties and methods)
Python Exception Handling
Python Modules
Python File Operations (I/O)
Method Resolution Order (MRO) in Python determines the order in which the base classes are searched when looking for a method. Understanding MRO is essential when working with multiple inheritance, as it helps you predict the behavior of your classes and avoid potential issues.
In Python, the MRO algorithm is known as C3 Linearization or the C3 superclass linearization. It ensures that the order of classes in the MRO respects the local precedence order and monotonicity.
Here's a step-by-step tutorial to understand Python's MRO:
To illustrate MRO, let's create a simple class hierarchy with multiple inheritance:
class A: def method(self): print("Method in class A") class B(A): def method(self): print("Method in class B") class C(A): def method(self): print("Method in class C") class D(B, C): pass
You can inspect the MRO of a class using the mro()
method or the __mro__
attribute:
print(D.mro()) # Output: [<class 'D'>, <class 'B'>, <class 'C'>, <class 'A'>, <class 'object'>] print(D.__mro__) # Output: (<class 'D'>, <class 'B'>, <class 'C'>, <class 'A'>, <class 'object'>)
The MRO of class D
is: D �� B �� C �� A �� object.
When you call a method on an object, Python searches for the method in the MRO of the object's class:
d = D() d.method() # Output: Method in class B
In this example, the method()
call on a D
object resolves to the implementation in class B
, as it appears first in the MRO.
super()
function:The super()
function is often used in the context of multiple inheritance to call a method from the next class in the MRO. In this example, let's call the method()
of the next class in the MRO from within class B
:
class B(A): def method(self): print("Method in class B") super().method() d = D() d.method() # Output: # Method in class B # Method in class C
By using super().method()
in class B
, we're now calling the method()
implementation from class C
, as it's the next class in the MRO.
This tutorial covered the basics of Python's MRO, how to inspect it, and how to use the super()
function to call methods from parent classes. Understanding MRO is crucial when working with complex class hierarchies and multiple inheritance, as it helps you predict the behavior of your classes and avoid potential issues.
Accessing and manipulating MRO in Python classes:
__mro__
attribute. It cannot be directly manipulated but can be influenced through the order of base classes.class A: pass class B(A): pass class C(A): pass class D(B, C): pass print(D.__mro__)
MRO in the context of super() function in Python:
super()
function uses the MRO to determine which class to delegate the method call to. It helps avoid hardcoding class names in case of inheritance changes.class A: def speak(self): print("A speaks") class B(A): def speak(self): super().speak() print("B speaks") class C(A): def speak(self): super().speak() print("C speaks") class D(B, C): pass my_instance = D() my_instance.speak()