5.1 Introduction aux décorateurs
Les décorateurs sont des fonctions qui prennent une autre fonction en tant qu'argument et renvoient une nouvelle fonction, modifiant ou étendant le comportement de la fonction d'origine. Les décorateurs sont utilisés pour améliorer la lisibilité et la réutilisabilité du code.
Les décorateurs permettent de modifier le comportement des fonctions ou des méthodes sans changer leur code source. Par conséquent, ils sont largement utilisés pour ajouter des fonctionnalités, faire du logging, du contrôle d'accès et bien d'autres choses.
La syntaxe des décorateurs en Python utilise le symbole @ avant le nom du décorateur, qui est placé avant la définition de la fonction.
@decorator
def my_function():
pass
C'est équivalent au code suivant :
def my_function():
pass
my_function = decorator(my_function)
Réfléchissez bien à ce qui se passe ici : nous déclarons la fonction
my_function
, mais ensuite nous la remplaçons par la fonction decorator
, où
notre fonction est passée en paramètre. La fonction
decorator
peut appeler notre fonction à sa guise.
5.2 Création d'un simple décorateur
Regardons un simple décorateur qui affiche un message avant et après l'appel de la fonction.
def my_decorator(func):
def wrapper():
print("Avant l'appel de la fonction")
func()
print("Après l'appel de la fonction")
return wrapper
@my_decorator
def say_hello():
print("Hello!")
say_hello()
Explication
Le décorateur (my_decorator)
: Cette fonction prend la fonction func
en
tant qu'argument et renvoie une nouvelle fonction wrapper
, qui
appelle func
et ajoute un comportement supplémentaire avant et après son
appel.
La fonction avec le décorateur (say_hello)
: La fonction say_hello
est enveloppée par le décorateur
my_decorator
, ce qui ajoute un comportement supplémentaire lors de son appel.
Sortie :
# Avant l'appel de la fonction
Hello!
# Après l'appel de la fonction
5.3 Décorateurs avec des arguments
Les décorateurs peuvent accepter des arguments, ce qui permet de configurer leur comportement de manière flexible.
def repeat(num_times):
def decorator_repeat(func):
def wrapper(*args, **kwargs):
for _ in range(num_times):
func(*args, **kwargs)
return wrapper
return decorator_repeat
@repeat(num_times=3)
def say_hello(name):
print(f"Hello, {name}!")
say_hello("Alice")
Explication
Le décorateur avec arguments (repeat)
: Cette fonction accepte l'argument num_times
et renvoie
le décorateur decorator_repeat
.
Le décorateur (decorator_repeat)
: Ce décorateur prend la fonction func
et renvoie une nouvelle fonction wrapper
, qui
appelle func
num_times
fois.
La fonction avec le décorateur (say_hello)
: La fonction say_hello
est appelée trois fois grâce au décorateur repeat
.
Sortie :
Hello, Alice!
Hello, Alice!
Hello, Alice!
GO TO FULL VERSION