Maîtriser l'héritage multiple, multiniveau et l'ordre de résolution des méthodes (MRO) en Python
Héritage multiple Python
Explorez comment Python supporte l'héritage multiple, les nuances de l'héritage multiniveau, et comment l'ordre de résolution des méthodes (MRO) gouverne la recherche d'attributs.
Héritage multiple Python
Python permet à une classe d'hériter de plus d'une classe de base, tout comme C++. Cette fonctionnalité est connue sous le nom d'héritage multiple et permet à une classe dérivée de combiner le comportement de plusieurs classes parentes.
La syntaxe miroir l'héritage simple : vous listez toutes les classes parentes entre parenthèses, séparées par des virgules.
Exemple
class Base1:
pass
class Base2:
pass
class MultiDerivee(Base1, Base2):
pass
Dans cet exemple, MultiDerivee hérite des attributs et méthodes de Base1 et Base2.

Diagramme : MultiDerivee reçoit les fonctionnalités de Base1 et Base2.
Héritage multiniveau Python
Au-delà de deux niveaux, vous pouvez chaîner l'héritage : une classe hérite d'une classe dérivée, créant une hiérarchie d'héritage multiniveau. Python supporte n'importe quelle profondeur.
Chaque nouvelle classe dérivée hérite de son parent immédiat, tout en transmettant les attributs des ancêtres.
Exemple :
class Base:
pass
class Derivee1(Base):
pass
class Derivee2(Derivee1):
pass
Ici, Derivee1 étend Base, et Derivee2 étend davantage Derivee1, formant une chaîne à trois niveaux.

Ordre de résolution des méthodes (MRO) en Python
Chaque classe Python hérite finalement de object, le type de base universel. Par conséquent, tous les objets sont des instances de object, qu'ils soient intégrés ou définis par l'utilisateur :
# Sortie : True
print(issubclass(list, object))
# Sortie : True
print(isinstance(5.5, object))
# Sortie : True
print(isinstance("Bonjour", object))
Quand l'héritage multiple est impliqué, Python résout les attributs en utilisant un parcours en profondeur, de gauche à droite, sans revisiter une classe deux fois. Cet ordre de parcours est appelé Method Resolution Order (MRO) et garantit qu'une classe apparaît avant ses parents.
Le MRO pour MultiDerivee est : [MultiDerivee, Base1, Base2, object]. Vous pouvez le visualiser via l'attribut __mro__ ou la méthode mro() :
MultiDerivee.__mro__
# (<class '__main__.MultiDerivee'>, <class '__main__.Base1'>, <class '__main__.Base2'>, <class 'object'>)
MultiDerivee.mro()
# [<class '__main__.MultiDerivee'>, <class '__main__.Base1'>, <class '__main__.Base2'>, <class 'object'>]
Les graphes d'héritage complexes suivent le même principe. Considérez cet exemple :

# Démonstration du 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())
# Sortie :
# [<class '__main__.M'>, <class '__main__.B'>, <class '__main__.A'>, <class '__main__.X'>, <class '__main__.Y'>, <class '__main__.Z'>, <class 'object'>]
Pour approfondir l'algorithme qui calcule le MRO, consultez la documentation officielle Python sur l'héritage de classes et la discussion sur le MRO.
Python
- Maîtriser les types de données Python : Guide pratique
- Maîtriser les opérateurs Python : Guide complet
- Maîtriser l'instruction pass en Python : Guide pratique
- Maîtriser les dictionnaires Python : création, manipulation et techniques avancées
- Maîtriser les exceptions personnalisées Python : guide pratique
- Maîtriser la programmation orientée objet Python : classes, héritage, encapsulation et polymorphisme
- Maîtriser l'héritage Python : concepts, syntaxe et exemples pratiques
- Comprendre type() et isinstance() en Python : exemples pratiques
- Maîtriser l'héritage en C# : créer du code réutilisable et maintenable