Explication de la leçon
Après cette leçon, tu seras capable de :
super() lorsqu'une redéfinition doit étendre, plutôt que remplacer, le comportement parent.L'héritage crée une relation entre les types. Le polymorphisme permet au code de manipuler différents objets à travers un nom de méthode partagé. Une sous-classe redéfinit (override) une méthode en définissant une méthode portant le même nom. Appeler obj.summary() utilise l'implémentation appartenant à cet objet.
C'est l'équivalent Python de la redéfinition de méthodes en Java ou C#, mais tu n'as pas besoin d'ajouter @Override pour que cela fonctionne. Conserve les mêmes paramètres attendus et le même comportement de retour afin que les appelants n'aient pas besoin de connaître la sous-classe concrète.
Utilise super().method() lorsque le parent effectue déjà un travail utile que tu souhaites préserver. Une boucle peut alors traiter différents objets à travers la même interface, au lieu de vérifier leurs types et de dupliquer des branches conditionnelles.
Une sous-classe renvoie une étiquette spécialisée lorsque la même méthode est appelée.
class Device:
def status(self):
return "unknown"
class Router(Device):
def status(self):
return "online"
print(Device().status())
print(Router().status())Sortie :
unknown
onlineLa boucle n'a pas besoin de connaître la sous-classe exacte de chaque élément.
class Alert:
def level(self):
return "general"
class WarningAlert(Alert):
def level(self):
return "warning"
class ErrorAlert(Alert):
def level(self):
return "error"
alerts = [WarningAlert(), ErrorAlert(), Alert()]
for alert in alerts:
print(alert.level())Sortie :
warning
error
generalsuper() réutilise le message de base avant d'ajouter les informations de la sous-classe.
class Build:
def summary(self):
return "Build complete"
class VerifiedBuild(Build):
def summary(self):
return f"{super().summary()} | tests passed"
print(VerifiedBuild().summary())Sortie :
Build complete | tests passedChaque classe fournit une méthode label(), afin que l'appelant puisse les traiter de manière uniforme.
class Transport:
def label(self):
return "standard"
class ExpressTransport(Transport):
def label(self):
return "express"
def describe(transport):
return f"Shipping: {transport.label()}"
print(describe(ExpressTransport()))Sortie :
Shipping: express| Concept | Idée clé |
|---|---|
| Redéfinition de méthode | La sous-classe définit le même nom de méthode |
| Polymorphisme | Appeler la même méthode sur différents types d'objets |
super().method() | Réutiliser l'implémentation du parent |
| Interface partagée | L'appelant n'a pas besoin de brancher sur chaque type de sous-classe |