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 :
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.