Comprendre l'ordre de résolution des méthodes (Method Resolution Order - MRO)
Dans cette étape, vous allez apprendre l'ordre de résolution des méthodes (Method Resolution Order - MRO) en Python. Le MRO est l'ordre dans lequel Python recherche une méthode dans une hiérarchie de classes. Il est particulièrement important lorsqu'il s'agit d'héritage multiple.
Créons un nouvel ensemble de classes pour illustrer le MRO. Créez un fichier nommé animal.py
dans votre répertoire ~/project
en utilisant l'éditeur VS Code :
class Animal:
def __init__(self, name):
self.name = name
def speak(self):
return "Generic animal sound"
class Mammal(Animal):
def speak(self):
return "Generic mammal sound"
class Dog(Mammal):
def speak(self):
return "Woof!"
class Cat(Mammal):
def speak(self):
return "Meow!"
Enregistrez le fichier animal.py
.
Maintenant, créons un nouveau fichier nommé mro_example.py
dans le répertoire ~/project
pour démontrer le MRO :
from animal import Animal, Mammal, Dog, Cat
my_dog = Dog("Buddy")
my_cat = Cat("Whiskers")
print(my_dog.speak())
print(my_cat.speak())
Enregistrez le fichier mro_example.py
.
Dans cet exemple :
Animal
est la classe de base avec une méthode speak
.
Mammal
hérite de Animal
et remplace la méthode speak
.
Dog
hérite de Mammal
et remplace la méthode speak
.
Cat
hérite de Mammal
et remplace la méthode speak
.
Lorsque vous appelez my_dog.speak()
, Python cherche d'abord la méthode speak
dans la classe Dog
. S'il ne la trouve pas là, il la cherche dans la classe Mammal
, puis dans la classe Animal
. Cet ordre est déterminé par le MRO.
Pour exécuter le script mro_example.py
, ouvrez votre terminal et accédez au répertoire ~/project
:
cd ~/project
Ensuite, exécutez le script en utilisant la commande python
:
python mro_example.py
Vous devriez voir la sortie suivante :
Woof!
Meow!
Maintenant, explorons un exemple plus complexe avec de l'héritage multiple. Créez un nouveau fichier nommé mro_complex.py
dans le répertoire ~/project
:
class A:
def method(self):
return "A"
class B(A):
def method(self):
return "B"
class C(A):
def method(self):
return "C"
class D(B, C):
pass
d = D()
print(d.method())
print(D.mro())
Enregistrez le fichier mro_complex.py
.
Dans cet exemple :
- La classe
D
hérite à la fois de B
et de C
.
B
et C
héritent tous deux de A
.
- La méthode
method
est définie dans les trois classes A
, B
et C
.
Pour exécuter le script mro_complex.py
, ouvrez votre terminal et accédez au répertoire ~/project
:
cd ~/project
Ensuite, exécutez le script en utilisant la commande python
:
python mro_complex.py
Vous devriez voir la sortie suivante :
B
[<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>]
La sortie B
indique que la méthode method
de la classe B
est appelée. La méthode D.mro()
retourne un tuple représentant l'ordre de résolution des méthodes pour la classe D
. Dans ce cas, le MRO est D -> B -> C -> A -> object
. Cela signifie que lorsque vous appelez d.method()
, Python cherche d'abord la méthode dans la classe D
, puis dans la classe B
, puis dans la classe C
, puis dans la classe A
, et enfin dans la classe de base object
.
Comprendre le MRO est essentiel pour prédire le comportement de votre code lorsqu'il utilise l'héritage, en particulier l'héritage multiple.