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.
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.
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.
Paiement est une classe abstraite : elle déclare payer() sans l'écrire. C'est un contrat pour toutes ses filles.
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.
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 :
Paiement("Sara") provoque une TypeError.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.
Paiement, grâce au polymorphisme.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.
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): ...
Exécutez le code : les objets et leurs attributs s'afficheront ici.
É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).
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())
Dans chaque liste, quelle classe devrait être abstraite ? (1) Forme, Cercle, Carre ; (2) Animal, Chat, Chien ; (3) Document, Facture, Devis.
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.
Que signifie le message « Can't instantiate abstract class Virement without an implementation for abstract method 'payer' » ?
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.