En Python, l'héritage multiple est supporté et les appels aux méthodes des parents sont gérés par un ordre de résolution des méthodes linéaire (MRO - Method Resolution Order). La fonction super() permet d'appeler une méthode de la superclasse dans la hiérarchie et est particulièrement utile en cas d'héritage complexe.
super() garantit un appel correct des méthodes selon le MRO, et pas seulement à partir du parent direct.
class A: def do(self): print('A') class B(A): def do(self): print('B') super().do() class C(A): def do(self): print('C') super().do() class D(B, C): def do(self): print('D') super().do() D().do() # Affichera : # D # B # C # A
Subtilités : Chaque méthode doit appeler super(), sinon le MRO sera "cassé". De plus, les constructeurs (__init__) doivent appeler super().__init__().
Question : Que se passera-t-il si dans la hiérarchie d'héritage multiple, l'une des classes "oublie" d'appeler super() dans sa méthode ?
Réponse : Le MRO sera violé, certaines méthodes des parents ne seront tout simplement pas appelées. Exemple :
class A: def show(self): print('A') class B(A): def show(self): print('B') class C(A): def show(self): print('C') super().show() class D(B, C): def show(self): print('D'); super().show() D().show() # Affichera : D B # Les méthodes C et A ne sont pas appelées du tout
Histoire
super().__init__() dans l'une des classes intermédiaires. En conséquence, l'un des widgets n'a pas été correctement initialisé, ce qui n'a été signalé que par un bug rare.Histoire
Histoire
Dans une hiérarchie complexe de mixins avec des overrides, une méthode "a oublié" d'appeler super(). Cela a conduit à ce qu'une validation ne fonctionne pas sur un endpoint API, alors qu'elle fonctionnait correctement sur un autre. L'erreur a été trouvée après des semaines à étudier le MRO manuellement.