Warning: Undefined array key "DOKU_PREFS" in /home/clients/a4e6fc1ce1761b72982b805de0f418c4/web/python/mesrecettespython/inc/common.php on line 2082
decorateurs_modeles [Les recettes Python de Tyrtamos]

Outils pour utilisateurs

Outils du site


decorateurs_modeles

Warning: Undefined array key -1 in /home/clients/a4e6fc1ce1761b72982b805de0f418c4/web/python/mesrecettespython/inc/html.php on line 1458

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
decorateurs_modeles [2012/03/26 17:55]
tyrtamos
decorateurs_modeles [2012/03/26 18:08] (Version actuelle)
tyrtamos
Ligne 307: Ligne 307:
 ==== Décorateurs avec arguments ==== ==== Décorateurs avec arguments ====
  
-Même chose que le décorateur précédent, à part qu'on peut passer des arguments au décorateur pour déterminer son comportement devant chaque fonction décorée:+Même chose que le décorateur précédent, à part qu'on peut passer des arguments au décorateur pour déterminer son comportement devant chaque fonction décorée
 + 
 +Par rapport aux code habituellement présenté comme modèle, j'ajoute une variable de classe adr qui est un dictionnaire qui va stocker les adresses des instances. Sans cette solution (je n'en ai pas trouvé d'autres), on ne peut pas comme précédemment accéder à une méthode supplémentaire du décorateur comme 'resultat'.
  
 <code python> <code python>
 class decorateur(object): class decorateur(object):
     """ decorateur avec passage d'arguments """     """ decorateur avec passage d'arguments """
 +    
 +    adr = {}
 +    
     def __init__(self, *decargs, **deckwargs):     def __init__(self, *decargs, **deckwargs):
         self.decargs = decargs # arguments par position passés au décorateur         self.decargs = decargs # arguments par position passés au décorateur
         self.deckwargs = deckwargs # arguments par défaut passés au décorateur         self.deckwargs = deckwargs # arguments par défaut passés au décorateur
 +    
     def __call__(self, fonc):      def __call__(self, fonc): 
         @functools.wraps(fonc)         @functools.wraps(fonc)
Ligne 323: Ligne 329:
             # instructions après             # instructions après
             return result             return result
 +        self.__class__.adr[fonc.__name__] = self
         return appelfonc         return appelfonc
 +
 +    def resultat(self):
 +        pass
 </code> </code>
  
Ligne 339: Ligne 349:
 La ligne @functools.wraps(fonc) permet à la fonction décorée de conserver son nom (%%__name__%%) et son docstring (%%__doc__%%). La ligne @functools.wraps(fonc) permet à la fonction décorée de conserver son nom (%%__name__%%) et son docstring (%%__doc__%%).
  
-**Exemple d'utilisation:**  +On lance l'exécution de la méthode 'resultat' du décorateur comme suit:
- +
- +
- +
- +
- +
- +
- +
  
 +<code python>
 +decorateur.adr['nom_de_la_fonction_décorée'].resultat()
 +</code>
  
 De même que le décorateur sans argument, ça marche aussi pour décorer la méthode d'une classe: De même que le décorateur sans argument, ça marche aussi pour décorer la méthode d'une classe:
decorateurs_modeles.1332777343.txt.gz · Dernière modification: 2012/03/26 17:55 de tyrtamos