super Favorite

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 :

#norun
Employee.__init__(self, name=name, surname=surname)

Est donc équivalente à :

#norun
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.