Los decoradores en Python son básicamente funciones que toman otra función y extienden la funcionalidad de esa función sin modificarla explícitamente. Esto se realiza mediante el envío de una función como argumento a un decorador y luego el decorador devuelve una nueva función que contiene la funcionalidad original más cualquier funcionalidad adicional. Veamos un paso a paso:
1. Definición de un decorador:
```python
def mi_decorador(funcion): # Se define un decorador que acepta una función
def envoltura(): # Se define una función interna que envuelve la funcionalidad de la función original
print(“¡Esto se añade a mi función original!”)
funcion() # Se llama a la función original
return envoltura # El decorador retorna la nueva función envoltura
```
2. Ahora tienes un decorador llamado `mi_decorador`. Para usar tu decorador en una función, simplemente necesitas preceder la definición de la función con `@nombre_del_decorador`:
```python
@mi_decorador
def saludo():
print(“¡Hola!”)
```
3. Ahora, cada vez que llames a `saludo()`, en realidad estarás llamando a `mi_decorador(saludo())`. Que imprimirá “¡Esto se añade a mi función original!” y luego “¡Hola!”.
```python
saludo()
```
4. Salida:
```
¡Esto se añade a mi función original!
¡Hola!
```
Los decoradores son muy utilizados para extender la funcionalidad de las funciones y métodos, por ejemplo, en aplicaciones web como Flask y Django se utilizan decoradores para manejar rutas y vistas. También se pueden utilizar decoradores para hacer logging, timing, locks, entre otros.