> Les bases > Le langage > Décorateurs
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