13.5 Héritage multiple et classes mixin
Objectifs d'apprentissage
À la fin de cette section, vous devriez être en mesure de :
- Construire une classe qui hérite de plusieurs superclasses.
- Identifier le problème du diamant au sein de l'héritage multiple.
- Construire une classe mixin pour ajouter des fonctionnalités à une sous-classe.
Notions de base sur l'héritage multiple
L'héritage multiple (multiple inheritance) est un type d'héritage dans lequel une classe hérite de plusieurs classes. Une classe qui hérite de plusieurs classes énumère toutes ses superclasses dans la liste d'héritage de sa définition de classe. Ex. : class SubClass(SuperClass_1, SuperClass_2).
Concepts en pratique
Mise en œuvre de l'héritage multiple
Considérez le programme suivant :
class A:
def __init__(self, a_attr=2):
self.a_attr = a_attr
class B:
def __init__(self, b_attr=4):
self.b_attr = b_attr
class C(A, B):
def __init__(self, a_attr=5, b_attr=10, c_attr=20):
A.__init__(self, a_attr)
B.__init__(self, b_attr)
self.c_attr = c_attr
b_inst = B(2)
c_inst = C(1, 2)
Le problème du diamant et les classes mixin
L'héritage multiple doit être mis en œuvre avec précaution. Le problème du diamant (diamond problem) survient lorsqu'une classe hérite de plusieurs classes qui partagent une superclasse commune. Ex. : Dessert et BakedGood héritent toutes deux de Food, et ApplePie hérite de Dessert et de BakedGood.
Dessertet
BakedGoodredéfinissent toutes deux une méthode de
Food, la méthode redéfinie de
Fooddont hérite
ApplePieest ambiguë. Par conséquent, l'héritage en forme de diamant doit être évité.
Les classes mixin favorisent la modularité et peuvent éliminer le problème du diamant. Une classe mixin :
- N'a pas de superclasse
- Possède des attributs et des méthodes destinés à être ajoutés à une sous-classe
- N'est pas instanciée (Ex. : étant donné une classe
MyMixin,my_inst = MyMixin()ne devrait jamais être utilisé.)
Les classes mixin (mixin classes) sont utilisées dans l'héritage multiple pour ajouter des fonctionnalités à une sous-classe sans introduire de complications liées à l'héritage.
Concepts en pratique
Créer une classe mixin
Le code suivant n'est pas correct, car les plantes ne sont pas toutes carnivores. Suivez les modifications apportées par le développeur pour améliorer le programme. Remarque : Rose, Pitcher et VenusFlyTrap représentent des plantes qui réalisent toutes la photosynthèse. Pitcher et VenusFlyTrap représentent des plantes qui sont également carnivores et peuvent se nourrir.
Une instruction pass est utilisée en Python pour indiquer que du code sera écrit ultérieurement, et permet d'éviter certaines erreurs qui surviendraient si aucun code n'était écrit ou si un commentaire était utilisé à la place.
class Plant:
def photosynth(self):
print("Photosynthesizing")
def eat(self):
print("Eating")
class Rose(Plant):
pass
class Pitcher(Plant):
pass
class VenusFlyTrap(Plant):
pass
À vous d'essayer
Résoudre le problème du diamant avec une classe mixin
Le programme ci-dessous illustre l'héritage multiple et présente le problème du diamant. Modifiez le programme pour utiliser une classe mixin, OnlineMixin. OnlineMixin :
- Remplace
OnlineShop. - Est une superclasse de
FoodFast. - Possède une méthode,
process_online(), qui affiche"Connecting to server"et qui est appelée par la méthodeprocess_order()deFoodFast'.
La sortie doit correspondre à :
Processing meal order
Connecting to server
Enjoy your FoodFast order