Aller au contenu

match avec Héritage

Python 3.10+ introduit le mot-clé match, similaire à switch en Java/C++, mais plus puissant car il peut matcher des types d’objets et leurs attributs.


Exemple avec match sur les Classes

a) Matching de Types (Héritage)

def traiter_personne(personne):
    match personne:
        case Personne(nom, age):  # Match une instance de Personne
            print(f"Personne générale: {nom}, {age} ans")
        case Etudiant(nom, age, matiere):  # Match une instance d'Etudiant
            print(f"Étudiant en {matiere}: {nom}")
        case Professeur(nom, age, departement):  # Match une instance de Professeur
            print(f"Professeur de {departement}: {nom}")
        case _:  # Cas par défaut (comme "default")
            print("Type inconnu")


# Utilisation
p = Personne("Alice", 30)
e = Etudiant("Bob", 20, "Informatique")
prof = Professeur("Charlie", 45, "Mathématiques")

traiter_personne(p)  # "Personne générale: Alice, 30 ans"
traiter_personne(e)  # "Étudiant en Informatique: Bob"
traiter_personne(prof)  # "Professeur de Mathématiques: Charlie"

Utiliser le polymorphisme si possible

Encore une fois ici, il serait préférable d’utiliser le polymorphisme plutôt que de faire des vérifications de type avec match (ou isinstance() ou type()). Par exemple, on pourrait ajouter une autre méthode à la classe Personne et la surcharger dans les classes filles pour obtenir le comportement souhaité. Si on créait une nouvelle sous-classe, il faudrait redéfinir cette méthode dans la nouvelle sous-classe et on obtiendrait le comportement souhaité. Avec match, on devrait également ajouter une condition supplémentaire pour cette nouvelle sous-classe, et ce, partout où on a ce genre de situation (avec match ou isinstance() ou type()).


b) Matching avec Conditions Supplémentaires

On peut ajouter des conditions après le case :

def classifier_par_age(personne):
    match personne:
        case Personne(nom, age) if age < 18:
            print(f"{nom} est mineur")
        case Personne(nom, age) if age >= 65:
            print(f"{nom} est retraité")
        case Etudiant(nom, _, matiere) if "Informatique" in matiere:
            print(f"{nom} est un étudiant en tech!")
        case _:
            print("Cas par défaut")


classifier_par_age(Etudiant("Bob", 17, "Informatique"))  # "Bob est mineur"
classifier_par_age(Professeur("Charlie", 70, "Maths"))  # "Charlie est retraité"

c) Matching avec isinstance() (Alternative)

Si vous préférez éviter le destructuring (case Personne(nom, age)), utilisez isinstance :

def traiter_personne_alt(personne):
    match personne:
        case p if isinstance(p, Etudiant):
            print(f"Étudiant: {p.nom}, matière: {p.matiere_principale}")
        case p if isinstance(p, Professeur):
            print(f"Professeur: {p.nom}, département: {p.departement}")
        case _:
            print("Autre type")


traiter_personne_alt(e)  # "Étudiant: Bob, matière: Informatique"

Avantages du match avec l’Héritage

  • Plus lisible que des if isinstance() imbriqués.
  • Supporte le destructuring (accès direct aux attributs).
  • Extensible : Ajoutez facilement de nouveaux cas.

Conclusion

Le match est un outil puissant pour gérer le polymorphisme de manière élégante. Il remplace avantageusement les chaînes d’if/elif pour vérifier les types d’objets. Mais lorsque possible, il est normalement préférable d’utiliser le polymorphisme pour obtenir un résultat semblable.

📌 Astuce

Utilisez case _: comme “default” pour capturer tous les cas non matchés !