0Pricing
Python Academy · Leçon

Polymorphisme et typage structurel

Écrivez du code polymorphe qui fonctionne avec tout objet compatible.

Polymorphisme et typage structurel est une leçon Python Academy gratuite sur CoddyKit. Ceci est la leçon 4 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Python Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Python Academy comprend 4 leçons au total.

Introduction

Le polymorphisme permet à différents objets de répondre à la même interface. Le typage canard signifie : s’il se comporte comme un canard, c’est un canard.

Qu’est-ce que le polymorphisme ?

Le polymorphisme signifie « plusieurs formes ». Un même nom de méthode peut fonctionner différemment sur différents objets. Python l’utilise largement.
class Cat:
    def speak(self): return 'Meow'
class Dog:
    def speak(self): return 'Woof'
for animal in [Cat(), Dog()]:
    print(animal.speak())

Typage canard

Python n’exige pas de hiérarchie de classes pour le polymorphisme. Si un objet possède la bonne méthode, cela fonctionne. Les interfaces ne sont pas nécessaires.
class Duck:
    def quack(self): return 'Quack'
class Person:
    def quack(self): return 'I am quacking like a duck'
def make_it_quack(duck):
    print(duck.quack())
make_it_quack(Duck())
make_it_quack(Person())

Fonctions polymorphes

len() fonctionne sur les chaînes, les listes, les dictionnaires et les tuples, car tous implémentent __len__. C’est du polymorphisme intégré.
for obj in ['hello', [1,2,3], {'a':1}]:
    print(type(obj).__name__, len(obj))

Surcharge des opérateurs

+ fonctionne sur les entiers, les nombres à virgule flottante, les chaînes et les listes, car chacun implémente __add__ différemment.
print(1 + 2)        # int addition
print('a' + 'b')    # string concat
print([1] + [2])    # list concat

Typage canard fondé sur un protocole

Le protocole d’itération : tout objet possédant __iter__ et __next__ fonctionne dans les boucles for, sans classe de base nécessaire.
class Squares:
    def __init__(self, n): self.n,self.i=n,0
    def __iter__(self): return self
    def __next__(self):
        if self.i>=self.n: raise StopIteration
        x=self.i**2; self.i+=1; return x
print(list(Squares(5)))

EAFP ou LBYL

EAFP (Easier to Ask Forgiveness than Permission) utilise try/except. LBYL (Look Before You Leap) utilise if/hasattr. Python privilégie EAFP.
# LBYL:
if hasattr(obj, 'quack'):
    obj.quack()
# EAFP (Pythonic):
try:
    'hello'.quack()
except AttributeError:
    print('no quack')

isinstance() pour une répartition sûre

Lorsque vous avez besoin d’un comportement propre à un type, isinstance() est plus clair que l’interception de AttributeError.
def process(data):
    if isinstance(data, str):
        return data.upper()
    elif isinstance(data, list):
        return [x*2 for x in data]
print(process('hi'))
print(process([1,2,3]))

Classes de base abstraites comme protocoles

from abc import ABC, abstractmethod définit des protocoles formels. Les sous-classes doivent implémenter les méthodes abstraites.
from abc import ABC, abstractmethod
class Drawable(ABC):
    @abstractmethod
    def draw(self): pass
class Circle(Drawable):
    def draw(self): print('O')
Circle().draw()

typing.Protocol (3.8 et versions ultérieures)

class MyProtocol(Protocol): définit un sous-typage structurel sans ABC. Cela fonctionne avec mypy pour les vérifications statiques.
from typing import Protocol
class Quackable(Protocol):
    def quack(self) -> str: ...
def make_quack(x: Quackable) -> str:
    return x.quack()
print('protocol demo')

Le polymorphisme en pratique

Concevez des API qui acceptent tout objet possédant la bonne interface. Votre code devient ainsi extensible sans modification.
class JSONSerializer:
    def serialize(self, obj): import json; return json.dumps(obj)
class XMLSerializer:
    def serialize(self, obj): return f'<data>{obj}</data>'
def export(data, serializer):
    return serializer.serialize(data)
print(export({'x': 1}, JSONSerializer()))

Vérification rapide

Que signifie le typage canard en Python ?

Récapitulatif

Polymorphisme : même interface, comportement différent. Typage canard : le comportement compte, pas le type. Les protocoles définissent les interfaces de manière informelle. EAFP (try/except) est idiomatique en Python.

Continuez

Vos progrès sont excellents ! Continuez pour maîtriser le prochain concept.

Questions Fréquemment Posées

La leçon « Polymorphisme et typage structurel » est-elle gratuite ?

Oui — le texte complet de « Polymorphisme et typage structurel » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Python Academy, passe à CoddyKit PRO. Le cours Python Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Polymorphisme et typage structurel » ?

Écrivez du code polymorphe qui fonctionne avec tout objet compatible. Tu pratiques Python Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer Python Academy ?

Aucune expérience préalable n'est requise. Python Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 4 sur 4.

Combien de temps prend la leçon « Polymorphisme et typage structurel » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon Python Academy ?

Oui. Chaque leçon Python Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Héritage simple
  2. Redéfinition de méthodes et super()
  3. Héritage multiple et MRO
  4. Polymorphisme et typage structurel
← Retour à Python Academy