À 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.