Polymorphisme Python POO : typage Duck et interfaces

Maîtrisez le polymorphisme en Python. Apprenez à écrire du code flexible et faiblement couplé à l'aide du typage duck, du remplacement de méthode et des classes de base abstraites.

Essayez dans l'éditeur

Aperçu

Le polymorphisme est un terme grec signifiant « plusieurs formes ». En programmation orientée objet, cela fait référence à la capacité de différentes classes à répondre au même appel de méthode de leur propre manière. Le polymorphisme vous permet d'écrire une fonction unique capable de traiter de nombreux types d'objets différents, à condition qu'ils partagent une interface commune. Cela permet un faible couplage et rend vos systèmes logiciels hautement adaptables et faciles à étendre.

En Python, le polymorphisme est profondément lié à un concept connu sous le nom de Duck Typing. Le terme vient de la phrase : « S'il marche comme un canard et qu'il cancane comme un canard, alors ce doit être un canard. » En Python typé dynamiquement, une fonction ne se soucie pas de la classe à laquelle appartient un objet ; il se soucie uniquement de savoir si cet objet implémente les méthodes demandées. Par exemple, si vous avez une fonction qui appelle `.speak()`, vous pouvez lui transmettre un chien, un chat ou un robot. Tant qu'ils ont tous une méthode `.speak()`, le code fonctionne parfaitement.

Pour les architectures plus strictes, Python fournit des classes de base abstraites (ABC) via le module `abc` intégré. En héritant de `abc.ABC` et en utilisant le décorateur `@abstractmethod`, vous pouvez définir des interfaces formelles que les classes enfants sont obligées d'implémenter. Si une classe enfant ne parvient pas à définir les méthodes abstraites, Python générera une TypeError lorsque vous tenterez de l'instancier. Équilibrer le typage canard flexible avec des classes abstraites formelles est une compétence clé pour concevoir des bibliothèques Python résilientes.

Sortie de code et d'exécution

Implémentation de classes polymorphes représentant des formes qui calculent leur aire.

polymorphism_demo.py
Essayez dans l'éditeur
from abc import ABC, abstractmethod

class Shape(ABC):
    @abstractmethod
    def area(self):
        """Must be implemented by subclasses."""
        pass

class Square(Shape):
    def __init__(self, side):
        self.side = side
    def area(self):
        return self.side * self.side

class Circle(Shape):
    def __init__(self, radius):
        self.radius = radius
    def area(self):
        import math
        return math.pi * (self.radius ** 2)

# Polymorphic function accepting any Shape
def print_area(shape: Shape):
    print(f"Calculated Area: {shape.area():.2f}")

print_area(Square(4))
print_area(Circle(3))
Sortie terminale
Calculated Area: 16.00
Calculated Area: 28.27

Mise en œuvre étape par étape

  • Écriture de processeurs de paiement qui gèrent les objets CreditCard, PayPal et Stripe
  • Dessiner divers éléments (texte, image) à l'aide d'une boucle de rendu unifiée
  • Se moquer des connexions API externes pendant les tests unitaires

Foire aux questions

Qu’est-ce que le Duck Typing ?

Il s'agit de l'approche dynamique du polymorphisme de Python. Il vérifie la présence de méthodes et de propriétés au moment de l'exécution plutôt que de vérifier l'héritage d'une classe parent spécifique.

Pouvez-vous instancier une classe de base abstraite ?

Non. Toute tentative d'instancier une classe qui hérite d'ABC et contient des méthodes abstraites générera une TypeError.

Sujets connexes

Ressources Python recommandées

Développez vos connaissances avec des didacticiels interactifs, des aide-mémoire et des comparaisons de codes associés.