Skip to main content

Classes abstraites

Abstract Classes in Python

En programmation orientée objet, une classe abstraite est une classe qui ne peut pas être instanciée et est conçue pour être sous-classée, fournissant une interface de base pour ses classes dérivées. Python est un langage orienté objet qui prend en charge les classes abstraites via son module Abstract Base Class (ABC). Ce module offre un moyen de définir des classes abstraites et d'imposer leur interface à leurs sous-classes. Cet article explorera le concept de classes abstraites en Python et comment elles sont implémentées en utilisant la classe de base abstraite de Python.

Introduction à la classe abstraite Python

En Python, une classe abstraite est une classe qui est conçue pour être héritée par d'autres classes. Elle ne peut pas être instanciée seule et son but est de fournir un modèle pour que d'autres classes puissent s'en inspirer.

Une classe de base abstraite en Python est définie en utilisant le module abc. Il nous permet de spécifier qu'une classe doit implémenter des méthodes spécifiques, mais il ne fournit pas d'implémentation pour ces méthodes. Toute classe qui hérite d'une classe de base abstraite doit implémenter toutes les méthodes abstraites.

from abc import ABC, abstractmethod

class Shape(ABC):
    @abstractmethod
    def area(self):
        pass

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

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

r = Rectangle(5, 6)
print(r.area())    ### Output 30

Dans l'exemple ci-dessus, Shape est une classe de base abstraite qui définit une méthode abstraite area. Rectangle est une classe concrète qui hérite de Shape et implémente la méthode area.

from abc import ABC, abstractmethod

class Animal(ABC):
    @abstractmethod
    def talk(self):
        pass

class Dog(Animal):
    def talk(self):
        return "Woof!"

class Cat(Animal):
    def talk(self):
        return "Meow"

c = Cat()
print(c.talk())    ### Output Meow

d = Dog()
print(d.talk())    ### Output Woof!

Dans cet exemple, Animal est une classe de base abstraite qui définit une méthode abstraite talk. Dog et Cat sont des classes concrètes qui héritent de Animal et implémentent la méthode talk.

En conclusion, les classes abstraites en Python fournissent un moyen de définir un modèle pour que d'autres classes puissent se construire dessus. Elles ne peuvent pas être instanciées par elles-mêmes et elles offrent un moyen de garantir que les sous-classes implémentent des méthodes spécifiques. Le module abc offre un moyen de définir des classes de base abstraites en Python.

Création de Classe de Base Abstraite Python

Une classe abstraite est une classe qui ne peut pas être instanciée et est destinée à être utilisée comme classe de base pour d'autres classes.

En Python, le module abc fournit la classe ABC. Elle est utilisée pour créer des classes de base abstraites.

Pour créer une classe de base abstraite, nous devons hériter de la classe ABC et utiliser le décorateur @abstractmethod pour déclarer des méthodes abstraites.

Exemple de Classe Abstraite

from abc import ABC, abstractmethod

class Shape(ABC):

    @abstractmethod
    def area(self):
        pass

    @abstractmethod
    def perimeter(self):
        pass

Dans cet exemple, nous avons créé une classe de base abstraite Shape avec deux méthodes abstraites area et perimeter. Toute classe qui hérite de Shape doit implémenter ces deux méthodes.

Exemple de Classe Abstraite avec Héritage


from abc import ABC, abstractmethod

class Animal(ABC):

    @abstractmethod
    def sound(self):
        pass

class Dog(Animal):

    def sound(self):
        return 'Woof'

Dans cet exemple, nous avons créé une classe de base abstraite Animal avec une méthode abstraite sound. Nous avons également créé une classe Dog qui hérite de Animal et implémente la méthode sound.

Une classe qui hérite d'une classe de base abstraite doit implémenter toutes les méthodes abstraites déclarées dans la classe de base, à moins qu'elle ne soit également une classe abstraite.

Classe Abstraite Python vs Interface

Une classe abstraite est une classe Python qui ne peut pas être instanciée, et elle est utilisée pour définir des propriétés et comportements communs que les sous-classes peuvent hériter. Elle est définie en utilisant le module abc, qui signifie classe de base abstraite. Une classe abstraite est utilisée lorsque nous voulons définir une classe de base, et nous ne voulons pas qu'elle soit instanciée. Instead, nous voulons qu'elle soit sous-classée par d'autres classes qui fourniront des implémentations spécifiques de ses méthodes abstraites.

Exemple d'une Classe de Base Abstraite Python

from abc import ABC, abstractmethod
 
class Animal(ABC):
     
    @abstractmethod
    def move(self):
        pass
 
class Dog(Animal):
     
    def move(self):
        print("I am walking on four legs")
         
class Snake(Animal):
     
    def move(self):
        print("I am slithering")
         
d = Dog()
d.move()
 
s = Snake()
s.move()

Dans l'exemple ci-dessus, Animal est une classe de base abstraite avec une méthode abstraite appelée move(). Dog et Snake sont deux sous-classes de la classe Animal, et elles fournissent leurs implémentations spécifiques de la méthode move().

Interfaces en Python

Une interface est une collection de méthodes abstraites qui définit le comportement d'une classe. En Python, il n'existe pas de définition stricte d'une interface comme dans d'autres langages de programmation comme Java. A la place, nous utilisons des classes abstraites pour définir les interfaces. Une interface peut être considérée comme un contrat entre la classe et le monde extérieur. Une classe qui implémente une interface doit fournir une implémentation pour toutes les méthodes définies dans l'interface.

Exemple d'une Interface Python

from abc import ABC, abstractmethod
 
class Shape(ABC):
     
    @abstractmethod
    def area(self):
        pass
 
    @abstractmethod
    def perimeter(self):
        pass
 
class Rectangle(Shape):
     
    def __init__(self, length, width):
        self.length = length
        self.width = width
     
    def area(self):
        return self.length * self.width
     
    def perimeter(self):
        return 2 * (self.length + self.width)

r = Rectangle(10, 5)
print("Area of Rectangle:", r.area())  # Area of Rectangle: 50
print("Perimeter of Rectangle:", r.perimeter()) # Perimeter of Rectangle: 30

Dans l'exemple ci-dessus, Shape est une interface avec deux méthodes abstraites appelées area() et perimeter(). Rectangle est une classe qui implémente l'interface Shape et fournit son implémentation pour les méthodes area() et perimeter().

Polymorphisme dans les Classes Abstraites Python

Une classe abstraite est une classe qui ne peut pas être instanciée, mais elle peut servir de base pour d'autres classes. C'est un moyen de définir une interface commune pour un groupe de classes liées. Le polymorphisme est la capacité d'un objet à prendre de nombreuses formes. En Python, les classes abstraites peuvent être utilisées pour implémenter le polymorphisme.

from abc import ABC, abstractmethod

class Animal(ABC):
    @abstractmethod
    def move(self):
        pass

class Dog(Animal):
    def move(self):
        print("Dog is running")

class Cat(Animal):
    def move(self):
        print("Cat is jumping")

d = Dog()
c = Cat()

d.move() ### This will print "dog is running"
c.move() ### This will print "cat is jumping"

Utilisation des classes de base abstraites (ABC) en Python

Les classes abstraites en Python sont des classes qui ne peuvent pas être instanciées, et sont destinées à être héritées par d'autres classes. Elles sont utiles pour définir des méthodes et propriétés communes qui devraient être implémentées par leurs sous-classes concrètes.

Une manière d'implémenter des classes abstraites en Python est d'utiliser des classes de base abstraites (ABC) provenant du module abc. Un ABC est un type spécial de classe qui ne peut pas être instancié directement, mais peut être sous-classé. Les ABCs définissent une ou plusieurs méthodes abstraites, qui sont des méthodes qui doivent être implémentées par toute sous-classe concrète.

L'exemple de code suivant montre comment définir une classe de base abstraite Animal, qui définit deux méthodes abstraites speak et move qui doivent être implémentées par toute sous-classe concrète :

from abc import ABC, abstractmethod

class Animal(ABC):
    @abstractmethod
    def speak(self):
        pass
    
    @abstractmethod
    def move(self):
        pass

class Cat(Animal):
    def speak(self):
        print('meow')
    
    def move(self):
        print('running')

Maintenant, toute sous-classe concrète de Animal doit implémenter à la fois speak et move.

Un autre avantage de l'utilisation des ABCs en Python est qu'ils peuvent être utilisés pour imposer un certain contrat d'interface sur les classes, sans spécifier leurs détails d'implémentation.

Par exemple, si vous voulez définir une fonction qui accepte uniquement des objets ayant une méthode draw, vous pourriez définir un ABC nommé Drawable, qui définit une méthode abstraite draw :

from abc import ABC, abstractmethod

class Drawable(ABC):
    @abstractmethod
    def draw(self):
        pass
        
def draw_all(drawables):
    for drawable in drawables:
        drawable.draw()

class Rectangle(Drawable):
    def draw(self):
        print('Drawing a rectangle')
    
    
class Circle(Drawable):
    def draw(self):
        print('Drawing a circle')
    
draw_all([Rectangle(), Circle()])

Dans cet exemple, la fonction draw_all accepte une liste d'objets Drawable, qu'elle dessine en appelant leur méthode draw. Les classes Rectangle et Circle implémentent toutes les deux la méthode draw, donc elles peuvent être utilisées avec la fonction draw_all.

Dans l'ensemble, les classes de base abstraites en Python fournissent un outil puissant pour la conception de code, en vous permettant de définir une fonctionnalité commune qui peut être facilement étendue et personnalisée par des sous-classes concrètes.

Meilleures pratiques pour la conception de classes abstraites Python

Lors de la conception de classes abstraites en Python, il est important de suivre les meilleures pratiques pour garantir une base de code maintenable et lisible.

  1. Utilisez le module abc pour définir une classe de base abstraite (ABC).
import abc

class Shape(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def area(self):
        pass
    
class Circle(Shape):
    def __init__(self, radius):
        self.radius = radius
        
    def area(self):
        return 3.14 * self.radius ** 2
  1. Utilisez des méthodes abstraites pour spécifier le contrat que les classes dérivées doivent suivre.
import abc

class Vehicle(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def start_engine(self):
        pass
    
class Car(Vehicle):
    def start_engine(self):
        print("Engine started")

class Bike(Vehicle):
    pass

my_car = Car()
my_car.start_engine()    # "Engine started"

# my_bike = Bike()    TypeError: Can't instantiate abstract class Bike with abstract methods start_engine

Suivre ces meilleures pratiques garantira que vos classes abstraites soient facilement compréhensibles et maintenables, avec des contrats clairs pour les classes dérivées à suivre.

Contribuez avec nous!

N'hésitez pas à contribuer aux tutoriels Python sur GitHub : créez un fork, mettez à jour le contenu et émettez une pull request.

Profile picture for user AliaksandrSumich
Python engineer, expert in third-party web services integration.
Mise à jour : 03/05/2024 - 22:51
Profile picture for user angarsky
Examiné et approuvé