""" Le « duck typing » est un style de programmation qui met l'accent sur le comportement d'un objet plutôt que sur son type spécifique. Ce nom tire son origine de l'expression « Si ça ressemble à un canard et que ça cancane comme un canard, alors c'est un canard ». Dans le « duck typing », l'adéquation d'un objet à un contexte particulier est déterminée par la présence de certaines méthodes et propriétés, plutôt que par le type réel de l'objet. """ from abc import ABC, abstractmethod def send_alert(notifier, message): return notifier.send(message) """ Les classes de base abstraites (ABC) constituent un moyen de définir des interfaces en Python. Elles permettent de créer un modèle pour les classes qui doivent implémenter certaines méthodes. Cependant, l'utilisation des ABC peut entraîner un couplage étroit entre l'interface et l'implémentation, ce qui va à l'encontre des principes du duck typing. Dans le duck typing, on s'intéresse avant tout à la capacité d'un objet à effectuer une action donnée (comme envoyer un message), plutôt qu'à savoir s'il s'agit d'une instance d'une classe spécifique ou s'il implémente une interface spécifique. """ class Notifier(ABC): @abstractmethod def send(self, message: str) -> str: ... """ Les méthodes abstraites sont des méthodes déclarées dans une classe de base abstraite mais qui ne disposent pas d'implémentation. Elles servent de contrat que les sous-classes doivent respecter. Cependant, le recours aux méthodes abstraites peut entraîner un couplage étroit entre l'interface et l'implémentation, ce qui va à l'encontre des principes du duck typing. Dans le duck typing, ce qui importe, c'est de savoir si un objet est capable d'effectuer une action donnée (comme envoyer un message), plutôt que de savoir s'il s'agit d'une instance d'une classe spécifique ou s'il implémente une interface spécifique. """ class SlackNotifier(Notifier): def send(self, message: str) -> str: return f"Sent to Slack: {message}" slack_notifier = SlackNotifier() print(send_alert(slack_notifier, "This is a test alert!"))