SUPER |
Super |
---|---|
Python |
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.
Algorithme
MODULE SUPER(classe=None, instance=None) SI classe est NULL ALORS classe ← déterminer la classe actuelle depuis le contexte d'exécution FIN SI SI instance est NULL ALORS instance ← déterminer l'instance actuelle depuis le contexte d'exécution FIN SI BOUCLE POUR CHAQUE classe_parente dans l'ordre des parents de `classe`: SI classe_parente est après `classe` dans l'ordre MRO ALORS RETOURNE proxy vers classe_parente pour `instance` FIN SI FIN BOUCLE POUR CHAQUE RETOURNE Erreur : pas de classe parente trouvée |
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