Python : Décorateurs

De Justine's wiki
Aller à la navigation Aller à la recherche

Base

Un décorateur est un objet permettant de modifier le comportement d'une fonction sans avoir à intervenir à l'intérieur de celle-ci. C'est utile pour étendre simplement les fonctionnalités d'un script ou d'une fonction.

Exemple simple

<syntaxhighlight lang='python'>

  1. ! /usr/bin/env python3
  2. coding: utf-8
  1. Définition d'un décorateur, qui fait des choses avec une fonction

def decorateur(func):

   
   Mon décorateur prend une fonction en paramètre et la renvoie décorée
   
   print("---------")
   return func
      1. PREMIERE METHODE
  1. on passe le décorateur après la définition de la fonction
  2. Fonction de base

def bonjour():

   print("Bonjour")

print(f"Avant") bonjour()

  1. On utilise le décorateur pour la fonction bonjour

bonjour = decorateur(bonjour)

print(f"Apres :") bonjour()

      1. SECONDE METHODE
  1. On passe le décorateur avant la fonction

@decorateur def salut():

   print("Salut")

salut() </syntaxhighlight>

Exemple plus complexe (et plus utile)

<syntaxhighlight lang='python'>

  1. ! /usr/bin/env python3
  2. coding: utf-8
  1. Exemple complexe de décorateurs
  1. On simule ici un site web qui gère des connexions utilisateurs

user_logged = False

def decorateur(func):

   
   Un décorateur pour n'exécuter ma fonction que si l'utilisateur est connecté. Il va renvoyer wrapper,
   qui est lui-même une fonction.
   
   #Une fonction dans ma fonction, c'est possible
   def wrapper_log():
       
       La fonction renvoyée par le décorateur, qui va aller "autour" de la fonction décorée.
       
       if user_logged:
           return func()
       else:
           print("Connectez-vous pour accéder au profil")
   #On renvoi la fonction du wrapper en tant qu'objet
   return wrapper_log

@decorateur def profile():

   
   Fonction d'accès au profil utilisateur. Elle ne fait que ça !
       
   print("Le code html du profil...")

profile() </syntaxhighlight>