Mis a jour le 2025-04-14, 12:10

Décorateurs

Decorator :
  • c'est en fait une fonction qui retourne une autre fonction de façon à faire du travail avant l'appel et après l'appel de la fonction initiale.
  • exemple :
    @staticmethod
    def f(...):
        ....
        
    est équivalent à :
    def f(...):
        ...
    f = staticmethod(f)
        
  • d'une manière générale :
    @f1(arg)
    @f2
    def func():
       ...
        
    est équivalent à :
    def func():
        ...
    func = f1(arg)(f2(func))
        
Exemple complet de decorator :
  • import time
    import functools
    
    def timeIt(myFunc):
        @functools.wraps(myFunc)
        def wrapper(*args, **kwargs):
            startTime = time.time()
            value = myFunc(*args, **kwargs)
            endTime = time.time()
            sys.stderr.write('Time to run ' + myFunc.__name__ + ' : ' + str(endTime - startTime) + '
    ')
            return value
    
        return wrapper
    
    @timeIt
    def fact(n):
        result = 1
        for i in range(1, n + 1):
            result *= i
        return result
        
  • ce decorator imprime le temps passé à exécuter la fonction.
  • *args, **kwargs permet de transmetre les arguments à la fonction (non nommés ou nommés).
  • @functools.wraps(myFunc) est pour faire en sorte que myFunc ait la bonne documentation (sinon, fact.__name__ ne renverrait pas fact, mais wrapper !).
decorateur @property : permet de convertir une fonction en propriété, pour y accéder comme si c'était un champ :
class C:
    def __init__(self, a):
        self.a = a

    @property
    def A(self):
        return self.a
  
on peut alors faire obj = C(3); obj.A (au lieu de obj.A()) pour accéder au champ a.

Copyright python-simple.com
programmer en python, tutoriel python, graphes en python, Aymeric Duclert