L'héritage multiple — la capacité d'une classe à hériter de plusieurs classes parentes — est apparu en Python inspiré par d'autres langages de POO (par exemple, C++), où il aide à créer des mixins réutilisables. Le développement du mécanisme de recherche des méthodes (MRO) a pris beaucoup de temps pour assurer une prévisibilité en cas de collisions de méthodes.
Une classe peut obtenir des méthodes avec le même nom à partir de différentes classes de base. Comment déterminer quelle méthode utiliser lors de l'appel ? Sans un schéma clair, cela peut entraîner des erreurs subtiles.
Python implémente l'algorithme MRO (C3 linearization), qui définit un ordre strict de recherche des méthodes lors de la résolution des conflits dans la hiérarchie. Tout devient transparent si l'on utilise la fonction super() et la méthode __mro__ des classes pour analyser la chaîne d'héritage.
Exemple de code :
class A: def foo(self): print("A") class B(A): def foo(self): print("B") super().foo() class C(A): def foo(self): print("C") super().foo() class D(B, C): def foo(self): print("D") super().foo() D().foo() print(D.__mro__)
Caractéristiques clés :
__mro__;Que se passe-t-il si les noms des méthodes parentes se chevauchent ?
Réponse : L'appel de la méthode se fera dans l'ordre défini par le MRO. La première méthode trouvée avec le nom requis dans la chaîne sera celle qui s'exécute.
Peut-on utiliser super() sans transmission explicite de self ?
Réponse : En Python 3 — oui, l'appel super().method() dans le corps d'une méthode de classe est équivalent à super(Class, self).method() explicite, mais uniquement à l'intérieur de la classe.
Peut-on modifier l'ordre MRO d'une classe existante ?
Réponse : L'ordre MRO est statique après la déclaration de la classe, mais il peut être consulté (ou créer une nouvelle classe avec un ordre d'héritage différent).
Dans un projet, deux mixins avec une méthode similaire ont été créés, la classe héritière utilise les deux mixins, mais appelle les méthodes directement par le nom de la classe, perturbant l'ordre des événements.
Avantages :
Inconvénients :
Utilisation de super() dans chaque méthode des mixins, garantissant l'appel en chaîne, et non l'omission du comportement requis.
Avantages :
Inconvénients :