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

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
Dernière révision Les deux révisions suivantes
decorateurs_modeles [2012/03/26 08:22]
tyrtamos
decorateurs_modeles [2012/03/26 18:04]
tyrtamos
Ligne 229: Ligne 229:
 class tempsexecmoyen(object): class tempsexecmoyen(object):
     """ decorateur sans passage d'argument """     """ decorateur sans passage d'argument """
 +
     def __init__(self, fonc):     def __init__(self, fonc):
         self.fonc = fonc         self.fonc = fonc
Ligne 234: Ligne 235:
         self.tt = 0  # temps total cumulé         self.tt = 0  # temps total cumulé
         functools.wraps(fonc)(self)         functools.wraps(fonc)(self)
 +
 +    def __get__(self, inst, owner=None):
 +        """nécessaire pour décorer les méthodes: avoir le bon 'self' """
 +        return types.MethodType(self, inst)
 +
     def __call__(self, *args, **kwargs):     def __call__(self, *args, **kwargs):
         """ méthode appelée à chaque appel de la fonction décorée """         """ méthode appelée à chaque appel de la fonction décorée """
Ligne 243: Ligne 249:
         print u"Temps moyen: %.7f" % (self.tt/self.c)         print u"Temps moyen: %.7f" % (self.tt/self.c)
         return result         return result
 +
 +    def resultat(self):
 +        """retourne le résultat: compteur d'appel et temps moyen d'exécution"""        
 +        if self.c == 0: 
 +            tm = 0
 +        else: 
 +            tm = self.tt/self.c
 +        return c, tm
 +
  
 @tempsexecmoyen @tempsexecmoyen
Ligne 269: Ligne 284:
 #Temps moyen: 0.0003946 #Temps moyen: 0.0003946
 #4536 #4536
 +</code>
 +
 +J'ai ajouté la méthode 'resultat' au décorateur. On peut l'appeler à tout moment __séparément__ de son effet sur l'exécution de la fonction décorée. Et on l'appelle par l'intermédiaire de la fonction décorée! cela donnera le nombre total d'appels ainsi que la moyenne des temps d'exécution cumulés sur tous les appels:
 +
 +<code python>
 +print calcul.resultat()
 </code> </code>
  
Ligne 286: 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 302: 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>
  
decorateurs_modeles.txt · Dernière modification: 2012/03/26 18:08 de tyrtamos