Decorator Fundamentals
Qu'est-ce qu'un décorateur ?
Les décorateurs sont une fonctionnalité puissante de Python qui vous permet de modifier ou d'améliorer des fonctions et des méthodes sans modifier directement leur code source. Ils offrent un moyen propre et réutilisable d'étendre les fonctionnalités.
Structure de base d'un décorateur
def my_decorator(func):
def wrapper(*args, **kwargs):
## Code before function execution
result = func(*args, **kwargs)
## Code after function execution
return result
return wrapper
@my_decorator
def example_function():
pass
Visualisation du flux d'un décorateur
graph TD
A[Original Function] --> B[Decorator Wrapper]
B --> C{Pre-processing}
C --> D[Original Function Call]
D --> E{Post-processing}
E --> F[Return Result]
Types de décorateurs
Type de décorateur |
Description |
Cas d'utilisation |
Décorateurs de fonction |
Modifient le comportement d'une fonction |
Journalisation, chronométrage, authentification |
Décorateurs de classe |
Modifient le comportement d'une classe |
Patron singleton, mise en cache |
Décorateurs de méthode |
Améliorent la fonctionnalité d'une méthode |
Validation, contrôle d'accès |
Techniques avancées de décorateurs
Décorateurs paramétrés
def repeat(times):
def decorator(func):
def wrapper(*args, **kwargs):
for _ in range(times):
result = func(*args, **kwargs)
return result
return wrapper
return decorator
@repeat(times=3)
def greet(name):
print(f"Hello, {name}!")
Conservation des métadonnées
import functools
def my_decorator(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
"""Wrapper function documentation"""
return func(*args, **kwargs)
return wrapper
Décorateurs spécifiques aux coroutines
Les décorateurs peuvent être particulièrement puissants avec les coroutines :
import asyncio
import time
def timer_decorator(func):
async def wrapper(*args, **kwargs):
start = time.time()
result = await func(*args, **kwargs)
end = time.time()
print(f"Execution time: {end - start} seconds")
return result
return wrapper
@timer_decorator
async def async_operation():
await asyncio.sleep(1)
return "Operation completed"
Modèles courants de décorateurs
Modèle |
Description |
Exemple |
Journalisation |
Suivre les appels de fonction |
Journaliser l'entrée/sortie d'une méthode |
Mise en cache |
Stocker les résultats d'une fonction |
Mémoïsation |
Authentification |
Contrôler l'accès |
Vérifier les autorisations d'utilisateur |
Nouvelle tentative |
Implémenter une logique de nouvelle tentative |
Gérer les échecs transitoires |
Bonnes pratiques
- Gardez les décorateurs simples et ciblés
- Utilisez
functools.wraps
pour conserver les métadonnées de la fonction
- Évitez les logiques complexes dans les décorateurs
- Prenez en compte les implications sur les performances
Les décorateurs ajoutent une petite surcharge en raison de l'enrobage de la fonction. Dans le code critique pour les performances, utilisez-les avec discernement.
En maîtrisant les décorateurs, les développeurs peuvent écrire un code plus modulaire et maintenable, une compétence très appréciée dans les environnements de programmation avancés de LabEx.