Syntaxe
super(type)
|
super(type,object-or-type)
|
Paramètres
Nom |
Description |
type |
Ce paramètre permet d'indiquer le type. |
object-or-type |
Ce paramètre permet d'indiquer un objet ou un type. |
Description
Cette fonction permet de retourner un objet proxy déléguant les appels de méthode à une classe parent ou frère de type.
Remarques
- La fonction super() ne fonctionne que pour les classes de nouveau style.
- La fonction super() est utile pour accéder aux méthodes héritées ayant été remplacées dans une classe. L'ordre de recherche est le même que celui utilisé par la fonction
getattr() sauf que le type lui-même est ignoré.
- L'attribut __mro__ du type répertorie l'ordre de recherche de résolution de méthode utilisé par les fonctions getattr() et super(). L'attribut est dynamique et
peut changer chaque fois que la hiérarchie d'héritage est mise à jour.
- Si le deuxième paramètre est omis, le super objet renvoyé n'est pas lié. Si le deuxième paramètre est un objet, isinstance(obj, type) doit être vrai. Si
le deuxième paramètre est un type, la fonction issubclass(type2, type) doit être vraie (ceci est utile pour les méthodes de classe).
- Il existe deux cas d'utilisation typiques pour la fonction super. Dans une hiérarchie de classes avec héritage unique, la fonction super peut être utilisé pour faire référence
aux classes parentes sans les nommer explicitement, ce qui rend le code plus maintenable. Cette utilisation est étroitement parallèle à l'utilisation de la fonction super dans d'autres
langages de programmation.
Le deuxième cas d'utilisation consiste à prendre en charge l'héritage multiple coopératif dans un environnement d'exécution dynamique. Ce cas d'utilisation est unique à Python et ne se
trouve pas dans les langages compilés statiquement ou les langages ne prenant en charge que l'héritage unique. Cette situation permet de mettre en oeuvre des «diagrammes en losange» où plusieurs
classes de base mettent en oeuvre la même méthode. Une bonne conception dicte que cette méthode a la même signature d'appel dans tous les cas (parce que l'ordre des appels est déterminé au moment
de l'exécution, parce que cet ordre s'adapte aux changements dans la hiérarchie des classes, et parce que cet ordre peut inclure des classes frères étant inconnues avant l'exécution).
- Notez que la fonction super() est mise en oeuvre dans le cadre du processus de liaison pour les recherches d'attributs pointillés explicites telles que super().__getitem__(name).
Il le fait en mettant en oeuvre sa propre méthode __getattribute__() pour rechercher des classes dans un ordre prévisible prenant en charge l'héritage multiple coopératif. Par conséquent,
la fonction super() n'est pas défini pour les recherches implicites utilisant des instructions ou des opérateurs tels que super()[name]. Notez également que la fonction super()
n'est pas limité à l'utilisation de méthodes internes. Le format de la syntaxe à deux paramètres spécifie exactement les paramètres et fait les références appropriées.
Dernière mise à jour : Mercredi, le 14 septembre 2016