Aller au contenu

Le polymorphisme

Le polymorphisme permet d'utiliser différents objets à travers une même opération, chaque objet fournissant son propre comportement.

Le polymorphisme par héritage

Plusieurs classes dérivées peuvent redéfinir une même méthode :

class Cat(Animal):
    def speak(self) -> str:
        return "Miaou"


animals: list[Animal] = [
    Dog("Rex", "Labrador"),
    Cat("Minou"),
]

for animal in animals:
    print(animal.speak())

Le résultat est :

Ouaf
Miaou

La méthode exécutée dépend du type réel de l'objet, comme lors de l'appel d'une méthode virtuelle redéfinie en C#.

Le duck typing

Python permet également d'utiliser des objets sans qu'ils héritent d'une même classe. Il suffit qu'ils proposent les opérations attendues par le traitement. Cette approche est appelée duck typing. Voici un exemple :

class Robot:
    def speak(self) -> str:
        return "Bonjour"


def make_speak(speaker) -> None:
    print(speaker.speak())


make_speak(Dog("Rex", "Labrador"))  # Ouaf
make_speak(Robot())                 # Bonjour

La fonction make_speak utilise la méthode speak, sans imposer de classe de base commune. Si l'objet fourni ne possède pas cette méthode, l'appel échoue.

Cette approche offre de la souplesse. Pour exprimer explicitement le contrat attendu et permettre sa vérification par un analyseur statique, Python propose notamment les protocoles avec typing.Protocol.