ProgrammationDéveloppeur Python Senior

Expliquez le modèle d'héritage et le fonctionnement de super() en Python. Quelles sont les particularités de l'utilisation de super() dans l'héritage multiple et quelles erreurs peut-on commettre ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse.

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.

Exemple de code :

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 piégée.

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

Exemples d'erreurs réelles dues à l'ignorance des subtilités du sujet.


Histoire

Dans un grand héritage de composants GUI, on a oublié d'appeler 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

Dans un serveur d'API REST, le logger qui devait par MRO "s'accrocher" à toutes les requêtes a été appelé directement par une des classes, et non par super(), ce qui a rompu la chaîne d'appel et les messages n'ont pas été enregistrés - l'équipe a cherché la raison pendant longtemps.

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.