Python Tutorials

Maîtriser l’Héritage en Python : Guide Complet

Spread the love

L’héritage est une pierre angulaire de la programmation orientée objet (POO), permettant la création de nouvelles classes (classes filles ou sous-classes) à partir de classes existantes (classes parentes ou superclasses). Cela favorise la réutilisabilité du code, réduit la redondance et encourage une base de code bien structurée. Ce tutoriel explore les mécanismes d’héritage de Python, en examinant différents types et en démontrant des applications pratiques.

Table des matières

  1. Surcharge de méthode
  2. Héritage multiple
  3. Héritage multi-niveau
  4. Exemple pratique : une hiérarchie de formes

Surcharge de méthode

La surcharge de méthode permet à une sous-classe de fournir une implémentation spécialisée pour une méthode héritée de sa superclasse. Cela personnalise le comportement hérité sans modifier la superclasse.


class Animal:
    def __init__(self, name):
        self.name = name

    def speak(self):
        print("Son d'animal générique")

class Dog(Animal):
    def speak(self):
        print("Woof !")

class Cat(Animal):
    def speak(self):
        print("Miaou !")

animal = Animal("Animal générique")
animal.speak()  # Sortie : Son d'animal générique

dog = Dog("Buddy")
dog.speak()  # Sortie : Woof !

cat = Cat("Whiskers")
cat.speak()  # Sortie : Miaou !

La fonction super() permet d’accéder à la méthode de la superclasse, permettant d’utiliser à la fois les comportements de la superclasse et de la sous-classe.


class Dog(Animal):
    def speak(self):
        super().speak() 
        print("Woof ! (de la classe Dog)")

Héritage multiple

Python prend en charge l’héritage multiple, où une classe hérite de plusieurs classes parentes, combinant ainsi les fonctionnalités. Cependant, la gestion des conflits de noms de méthode (le « problème du diamant ») nécessite une attention particulière. L’ordre de résolution des méthodes (ORM) de Python utilisant la linéarisation C3 assure une résolution des conflits prévisible. Vous pouvez inspecter l’ORM à l’aide de ClassName.__mro__.


class Flyer:
    def move(self):
        print("Vol !")

class Swimmer:
    def move(self):
        print("Nage !")

class FlyingFish(Flyer, Swimmer):
    pass

flying_fish = FlyingFish()
print(FlyingFish.__mro__) # Vérification de l'ORM
flying_fish.move()  # Sortie : Vol ! (la méthode move de Flyer est appelée en premier en raison de l'ORM)

Héritage multi-niveau

L’héritage multi-niveau crée une hiérarchie où une sous-classe hérite d’une autre sous-classe, qui elle-même hérite d’une superclasse. Cela s’appuie sur les classes existantes avec une spécialisation croissante.


class Animal:
    def __init__(self, name):
        self.name = name

class Mammal(Animal):
    def __init__(self, name, fur_color):
        super().__init__(name)
        self.fur_color = fur_color

class Dog(Mammal):
    def __init__(self, name, fur_color, breed):
        super().__init__(name, fur_color)
        self.breed = breed

dog = Dog("Buddy", "Brown", "Golden Retriever")
print(f"{dog.name} est un {dog.breed} avec une fourrure {dog.fur_color}.")
# Sortie : Buddy est un Golden Retriever avec une fourrure Brown.

Exemple pratique : une hiérarchie de formes

Illustrons l’héritage avec un exemple pratique : une hiérarchie de formes. Nous commencerons par une classe de base Shape et dériverons les classes Circle et Rectangle.


import math

class Shape:
    def __init__(self, name):
        self.name = name

    def area(self):
        raise NotImplementedError("La méthode area doit être implémentée dans les sous-classes")

class Circle(Shape):
    def __init__(self, name, radius):
        super().__init__(name)
        self.radius = radius

    def area(self):
        return math.pi * self.radius**2

class Rectangle(Shape):
    def __init__(self, name, width, height):
        super().__init__(name)
        self.width = width
        self.height = height

    def area(self):
        return self.width * self.height

circle = Circle("Circle", 5)
rectangle = Rectangle("Rectangle", 4, 6)

print(f"L'aire du {circle.name} est : {circle.area()}")
print(f"L'aire du {rectangle.name} est : {rectangle.area()}")

Cet exemple montre comment l’héritage facilite l’organisation et la réutilisabilité du code. La méthode area est définie dans la classe de base, obligeant les sous-classes à implémenter leurs calculs d’aire spécifiques.

Ce tutoriel fournit une introduction complète à l’héritage de classe en Python. Une exploration plus approfondie des classes de base abstraites, des interfaces et des modèles de conception qui utilisent l’héritage améliorera considérablement votre maîtrise de la POO.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *