Aller au contenu
M03 · B. Connaître les principaux piliers de la POO

L'abstraction : classes et méthodes abstraites

Définir une classe abstraite qui fixe ce que ses filles doivent savoir faire sans dire comment, et comprendre pourquoi on ne peut pas l'instancier.

1Situer

Un site de vente en ligne accepte plusieurs moyens de paiement : carte bancaire, paiement à la livraison, virement. Chaque moyen a sa propre façon de payer, mais tous doivent avoir une méthode payer(montant). Si un développeur oublie de l'écrire pour un nouveau moyen, l'erreur doit être détectée tout de suite, pas le jour où un client paie.

2Comprendre

La classe abstraite fixe le contrat
Paiementabstraite payer(montant) ? recu(montant) Paiement() ✕ Cartepayer() ✓ Livraisonpayer() ✓ Virement payer() oublié payer() ajouté ✓ for p in paiements: p.payer(250)

Paiement est une classe abstraite : elle déclare payer() sans l'écrire. C'est un contrat pour toutes ses filles.

1 / 5

L’abstraction consiste à ne garder que l’essentiel : on décrit ce que les objets d’une famille savent faire, sans dire comment. Chaque classe concrète fournit le comment.

Classe abstraite et méthode abstraite

En Python, on hérite de ABC et on marque les méthodes avec @abstractmethod :

from abc import ABC, abstractmethod

class Paiement(ABC):
    @abstractmethod
    def payer(self, montant):
        ...

Deux règles :

  1. On ne peut pas instancier une classe abstraite : Paiement("Sara") provoque une TypeError.
  2. Une classe fille n’est concrète (instanciable) que si elle écrit toutes les méthodes abstraites.

Ce qu’une classe abstraite peut contenir

Une classe abstraite n’est pas vide : elle peut avoir un constructeur, des attributs et des méthodes concrètes partagées par toutes les filles, comme recu() dans l’exemple.

Pourquoi c’est utile

  • Le contrat est clair : toute nouvelle classe de paiement doit savoir payer.
  • Les oublis sont détectés dès la création de l’objet, pas en production.
  • Le reste du programme travaille avec le type général Paiement, grâce au polymorphisme.
Exemple simple

Le mot « instrument »

On peut acheter un oud ou un violon, mais pas « un instrument » tout court : c'est une idée générale. Une classe abstraite, c'est pareil : elle décrit une famille, on ne crée que des objets concrets.

Exemple simple

Le cahier des charges

Le cahier des charges dit « le site doit permettre de payer » sans dire comment. Chaque prestataire réalise ce point à sa façon. La méthode abstraite est ce point du cahier des charges.

from abc import ABC, abstractmethod

class Paiement(ABC):
    @abstractmethod
    def payer(self, montant):
        ...

3Manipuler

Exécutez. Puis enlevez la méthode payer() de la classe Virement et relancez : Python refuse de créer l'objet, l'oubli est détecté immédiatement.
Pas à pas dans le lab ↗Python se charge au premier clic (environ 12 Mo, une seule fois).
Console
Mémoire : objets créés

Exécutez le code : les objets et leurs attributs s'afficheront ici.

4Pratiquer

Exercice 1 · La classe abstraite Employe

Écrivez une classe abstraite Employe(nom) avec une méthode abstraite salaire(). Écrivez deux classes concrètes : Permanent (salaire fixe) et Vacataire (taux horaire × heures).

Voir le corrigé
from abc import ABC, abstractmethod

class Employe(ABC):
    def __init__(self, nom):
        self.nom = nom
    @abstractmethod
    def salaire(self):
        ...

class Permanent(Employe):
    def __init__(self, nom, fixe):
        super().__init__(nom)
        self.fixe = fixe
    def salaire(self):
        return self.fixe

class Vacataire(Employe):
    def __init__(self, nom, taux, heures):
        super().__init__(nom)
        self.taux, self.heures = taux, heures
    def salaire(self):
        return self.taux * self.heures

for e in [Permanent("Nora", 9000), Vacataire("Yassine", 120, 40)]:
    print(e.nom, e.salaire())

Exercice 2 · Concret ou abstrait ?

Dans chaque liste, quelle classe devrait être abstraite ? (1) Forme, Cercle, Carre ; (2) Animal, Chat, Chien ; (3) Document, Facture, Devis.

Voir le corrigé
1. Forme   2. Animal   3. Document
Ce sont des catégories générales : on ne crée jamais
« une forme » ou « un document » sans préciser lequel.

Exercice 3 · Lire l'erreur

Que signifie le message « Can't instantiate abstract class Virement without an implementation for abstract method 'payer' » ?

Voir le corrigé
Python refuse de créer un objet Virement parce que la classe
n'a pas écrit la méthode payer(), déclarée abstraite dans Paiement.
Il faut ajouter def payer(self, montant): ... dans Virement.

5Vérifier

1. Peut-on créer un objet directement à partir d'une classe abstraite ?
2. Qu'est-ce qu'une méthode abstraite ?
3. En Python, quel module fournit ABC et abstractmethod ?