Pratiquer l'Héritage Multiple
Python permet à une classe d'hériter de plusieurs classes parentes. Ceci est appelé l'héritage multiple. Cela peut être un outil puissant pour combiner des fonctionnalités provenant de différentes sources, mais cela introduit également de la complexité, notamment dans la manière dont Python décide quelle méthode du parent utiliser si elles portent le même nom.
Cet ordre de recherche est appelé l'Ordre de Résolution des Méthodes (ORM) (Method Resolution Order - MRO). Python utilise un algorithme appelé linéarisation C3 pour déterminer un MRO cohérent et prévisible.
Explorons cela avec un nouvel exemple. Ouvrez le fichier multiple_inheritance.py dans l'explorateur de fichiers et ajoutez le code suivant :
## File: multiple_inheritance.py
class ParentA:
def speak(self):
print("Speaking from ParentA")
def common_method(self):
print("ParentA's common method")
class ParentB:
def speak(self):
print("Speaking from ParentB")
def common_method(self):
print("ParentB's common method")
## Child hérite de A, puis de B
class Child_AB(ParentA, ParentB):
pass
## Child hérite de B, puis de A
class Child_BA(ParentB, ParentA):
def common_method(self):
print("Child_BA's own common method")
if __name__ == "__main__":
child1 = Child_AB()
child2 = Child_BA()
print("--- Investigating Child_AB (ParentA, ParentB) ---")
child1.speak()
child1.common_method()
## La méthode .mro() montre l'Ordre de Résolution des Méthodes
print("MRO for Child_AB:", [c.__name__ for c in Child_AB.mro()])
print("\n--- Investigating Child_BA (ParentB, ParentA) ---")
child2.speak()
child2.common_method()
print("MRO for Child_BA:", [c.__name__ for c in Child_BA.mro()])
Enregistrez le fichier. Ici, Child_AB hérite de ParentA puis de ParentB. Child_BA hérite dans l'ordre inverse. Lorsqu'une méthode est appelée, Python la recherche dans l'ordre spécifié par le MRO.
Exécutez le script depuis le terminal :
python multiple_inheritance.py
Vous verrez la sortie suivante :
--- Investigating Child_AB (ParentA, ParentB) ---
Speaking from ParentA
ParentA's common method
MRO for Child_AB: ['Child_AB', 'ParentA', 'ParentB', 'object']
--- Investigating Child_BA (ParentB, ParentA) ---
Speaking from ParentB
Child_BA's own common method
MRO for Child_BA: ['Child_BA', 'ParentB', 'ParentA', 'object']
D'après la sortie, vous pouvez observer :
child1.speak() appelle la méthode de ParentA car ParentA apparaît en premier dans le MRO de Child_AB.
child2.speak() appelle la méthode de ParentB car ParentB apparaît en premier dans le MRO de Child_BA.
child2.common_method() appelle la version définie directement dans Child_BA, car Python la trouve là en premier avant de vérifier les parents.
Comprendre le MRO est crucial pour prédire le comportement dans les scénarios d'héritage multiple.