CodeGym /Cours Java /Python SELF FR /Initialisation de la hiérarchie

Initialisation de la hiérarchie

Python SELF FR
Niveau 16 , Leçon 1
Disponible

7.1 Méthode super()

Vu qu'on parle d'héritage, ce serait judicieux de discuter des subtilités liées aux champs et méthodes de la classe de base. Pour ça, Python propose la méthode super(). Cette méthode est utilisée pour appeler des méthodes de la classe de base à l'intérieur d'une classe dérivée.

Elle a trois principaux cas d'utilisation :

Appel des méthodes de la classe parente :

La méthode super() permet d'appeler une méthode de la classe parente depuis la classe dérivée, sans indiquer explicitement le nom de la classe parente. C'est particulièrement utile en cas d'héritage multiple et aide à éviter les erreurs lors de modifications de la hiérarchie des classes.

Initialisation des classes de base :

super() est souvent utilisé dans le constructeur de la classe dérivée pour appeler le constructeur de la classe de base, ce qui permet d'initialiser les attributs de la classe de base dans la classe dérivée.

Support de l'héritage multiple :

Dans le cas d'un héritage multiple, super() résout correctement l'ordre d'appel des méthodes (MRO, Method Resolution Order), rendant son utilisation préférable à l'appel explicite des méthodes des classes parentes. On en reparlera un peu plus tard.

7.2 Constructeur de la classe de base

Le constructeur de la classe de base doit être appelé explicitement. Cela semble automatique, mais en réalité, ce n'est pas le cas. Les constructeurs des classes de base doivent toujours être appelés explicitement car il est souvent nécessaire de leur passer des arguments spécifiques.

Exemple :


class Animal:
    def __init__(self, type, name):
        self.type = type
        self.name = name
         
        
class Dog(Animal):
    def __init__(self, name):
        super().__init__("Chien", name)  # Appel du constructeur de la classe de base
        
class Cat(Animal):
    def __init__(self, name):
        super().__init__("Chat", name)  # Appel du constructeur de la classe de base
        
        
# Création d'un objet Dog
dog = Dog("Buddy")
print(dog) 

Dans cet exemple, le constructeur de la classe de base (Animal) a deux paramètres : le type de l'animal et son nom. Tandis que les classes héritières n'en ont qu'un — juste le nom.

C'est donc dans les constructeurs des classes Dog et Cat qu'il est décidé de ce qui doit être passé au constructeur de la classe de base — c'est-à-dire les types d'animaux « Chien » et « Chat ».

Donc :

  • Il faut absolument appeler le constructeur de la classe de base dans le constructeur de la classe dérivée.
  • Pour cela, il faut utiliser la méthode super().
  • Pas besoin de passer l'argument self séparément — Python l'insère automatiquement lors de l'appel de la méthode.

7.3 Utilisation de la méthode super()

La méthode super() en Python peut être utilisée non seulement dans les constructeurs, mais aussi dans d'autres méthodes de classes pour appeler les méthodes de la classe parente. Cela peut être utile quand il est nécessaire d'étendre ou de modifier le comportement d'une méthode définie dans la classe parente.

Voyons quelques exemples :

Appel d'une méthode de la classe parente dans une méthode dérivée

Dans cet exemple, la méthode speak() de la classe Dog commence par appeler la méthode speak() de la classe Animal à l'aide de super(), puis ajoute son propre comportement.


class Animal:
    def speak(self):
        return "Un son animal générique"
        

class Dog(Animal):
    def speak(self):
        parent_speech = super().speak()  # Appel de la méthode de la classe parente
        return f"{parent_speech} Et le chien aboie !"
        
dog = Dog()
print(dog.speak())  # Affichera : Un son animal générique Et le chien aboie !

Appel d'une méthode de la classe parente pour vérifier l'état

Dans cet exemple, la méthode check_health() de la classe Dog appelle la méthode check_health() de la classe Animal pour ajouter des vérifications supplémentaires.


class Animal:
    def check_health(self):
        return "L'animal est en bonne santé"
        

class Dog(Animal):
    def check_health(self):
        parent_check = super().check_health()  # Appel de la méthode de la classe parente
        return f"{parent_check}. Le chien a besoin d'une promenade !"
        
dog = Dog()
print(dog.check_health())  # Affichera : L'animal est en bonne santé. Le chien a besoin d'une promenade !

Appel d'une méthode de la classe parente dans une méthode modifiant l'état

Dans cet exemple, la méthode withdraw() de la classe SavingsAccount vérifie d'abord si la limite de retrait est dépassée, et si ce n'est pas le cas, elle appelle la méthode withdraw() de la classe BankAccount pour effectuer l'opération.


class BankAccount:
    def __init__(self, balance):
        self.balance = balance
        

    def withdraw(self, amount):
        if self.balance >= amount:
            self.balance -= amount
            return f"Retrait de {amount}. Nouveau solde : {self.balance}"
        return "Fonds insuffisants"
        

class SavingsAccount(BankAccount):
    def withdraw(self, amount):
        if amount > 1000:
            return "Limite de retrait dépassée"
        return super().withdraw(amount)  # Appel de la méthode de la classe parente
        

savings = SavingsAccount(1500)
print(savings.withdraw(500))  # Affichera : Retrait de 500. Nouveau solde : 1000
print(savings.withdraw(1500))  # Affichera : Limite de retrait dépassée
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION