La prise électrique
Une prise ne sait pas si vous branchez un chargeur, une lampe ou un fer à repasser. Elle exige seulement que la fiche ait la bonne forme. Une interface, c'est la forme de la prise ; chaque appareil l'implémente.
Définir une interface, comprendre son utilité, et faire qu'une classe en implémente plusieurs, en Python avec des classes abstraites pures ou des protocoles.
Une clinique de Casablanca a un logiciel qui gère des factures, des ordonnances et des rendez-vous. Ces trois choses n'ont rien en commun, et pourtant il faut toutes les imprimer, et certaines doivent être envoyées par e-mail. On ne peut pas leur donner une même classe mère « Document » qui aurait du sens. On leur donne plutôt des capacités : « imprimable », « envoyable ». Ce sont des interfaces.
Deux interfaces décrivent des capacités : Imprimable exige imprimer(), Envoyable exige envoyer(email).
Une interface est un contrat : une liste de méthodes qu’une classe s’engage à fournir, sans aucun code. Elle décrit une capacité (« je sais m’imprimer ») plutôt qu’une famille.
Python n’a pas de mot-clé interface. On utilise une classe abstraite pure, qui ne contient que des méthodes abstraites :
class Imprimable(ABC):
@abstractmethod
def imprimer(self): ...
Une classe implémente l’interface en en héritant et en écrivant toutes ses méthodes. Elle peut en implémenter plusieurs : class Facture(Imprimable, Envoyable).
imprimer_tout() ne connaît pas Facture ni Ordonnance, seulement Imprimable.| Classe abstraite | Interface | |
|---|---|---|
| Contient | attributs, code, méthodes abstraites | seulement des méthodes abstraites |
| Représente | une famille (« est un ») | une capacité (« sait faire ») |
| Nombre par classe | une en général | plusieurs |
| Java / PHP | abstract class + extends | interface + implements |
Python propose aussi typing.Protocol : une classe respecte le protocole dès qu’elle a les bonnes méthodes, sans hériter de rien. C’est la version officielle du duck typing : « si ça marche comme un canard et cancane comme un canard, c’est un canard ».
Une prise ne sait pas si vous branchez un chargeur, une lampe ou un fer à repasser. Elle exige seulement que la fiche ait la bonne forme. Une interface, c'est la forme de la prise ; chaque appareil l'implémente.
Le permis atteste que vous savez conduire, quel que soit votre métier. Un médecin et un boulanger peuvent tous deux « implémenter » l'interface Conducteur, et une personne peut avoir plusieurs permis.
class Imprimable(ABC): @abstractmethod def imprimer(self): ... class Facture(Imprimable, Envoyable): # deux interfaces ...
Exécutez le code : les objets et leurs attributs s'afficheront ici.
Écrivez une interface Mesurable avec une méthode abstraite taille(). Faites-la implémenter par une classe Fichier(nom, octets) et une classe Video(titre, minutes). Écrivez une fonction plus_grand(liste) qui renvoie l'objet de taille maximale.
from abc import ABC, abstractmethod class Mesurable(ABC): @abstractmethod def taille(self): ... class Fichier(Mesurable): def __init__(self, nom, octets): self.nom, self.octets = nom, octets def taille(self): return self.octets class Video(Mesurable): def __init__(self, titre, minutes): self.titre, self.minutes = titre, minutes def taille(self): return self.minutes * 60 def plus_grand(liste): return max(liste, key=lambda x: x.taille())
Expliquez la différence entre une classe abstraite et une interface, et donnez un cas pour chacune.
Classe abstraite : une famille de classes proches qui partagent des attributs et du code (Paiement → Carte, Livraison). Interface : une capacité, sans code ni attribut, que des classes sans lien peuvent avoir (Imprimable : Facture, Ordonnance). Une classe hérite d'une seule famille en général, mais peut implémenter plusieurs interfaces.
En Python, imprimer_tout() fonctionnerait-elle avec un objet qui a une méthode imprimer() sans hériter de Imprimable ? Testez et expliquez.
Oui. Python ne vérifie pas le type à l'appel : il cherche juste une méthode imprimer(). C'est le « duck typing » : « si ça marche comme un canard... ». L'interface ABC sert à rendre le contrat explicite et à détecter les oublis dès la création de l'objet.