À quoi sert la fonction super en Python ?
La fonction super
est généralement utilisée pour obtenir la classe parente sans avoir besoin de la nommer explicitement.
On l'utilise donc généralement pour faire de la délégation, notamment à l'intérieur de la méthode __init__
dans le cas d'une classe qui hérite d'une autre classe :
class Employee: def __init__(self, name, surname): self.name = name self.surname = surname class Boss(Employee): def __init__(self, name, surname): # Sans super # Employee.__init__(self, name=name, surname=surname) super().__init__(name=name, surname=surname) self.big_boss = True boss = Boss(name="John", surname="Smith") print(boss.name, boss.surname)
On utilise ici super
pour ne pas avoir à écrire explicitement le nom de la classe dont Boss
hérite (ici, Employee
).
La ligne :
Employee.__init__(self, name=name, surname=surname)
Est donc équivalente à :
super().__init__(name=name, surname=surname)
Avec Python 2, il fallait passer la classe et l'instance à la fonction super (super(Boss, self).__init__(name, surname)
) mais ce n'est plus le cas avec Python 3.
À noter que cette fonction peut être utilisée en dehors de la méthode __init__
(et même en dehors d'une fonction ou d'une classe).
Par exemple dans le code ci-dessous, on surcharge la méthode parle
de la classe Employee
dans la classe Boss
pour y ajouter un print
.
On utilise la fonction super
pour appeler la méthode parle
de la classe parente :
class Employee: def __init__(self, name, surname): self.name = name self.surname = surname def parle(self): print("Je m'appelle", self.name) class Boss(Employee): def __init__(self, name, surname): # Sans super # Employee.__init__(self, name=name, surname=surname) super().__init__(name=name, surname=surname) self.big_boss = True def parle(self): super().parle() # On pourrait à la place écrire Employee.parle(self) print("...et je suis le Boss 😎") patrick = Employee(name="Patrick", surname="Tremblay") boss = Boss(name="John", surname="Smith") patrick.parle() boss.parle()
La fonction super
est également utilisée de façon beaucoup plus complexe pour pouvoir manipuler le « MRO » (Method Resolution Order ou « ordre de résolution des méthodes » en français).
Si vous souhaitez en savoir plus sur cette utilisation de la fonction super, je vous recommande la lecture de cet excellent article.