5.1 Introducción a los decoradores
Decoradores son funciones que toman otra función como argumento y devuelven una nueva función, modificando o ampliando el comportamiento de la función original. Se utilizan para mejorar la legibilidad y reutilización del código.
Los decoradores permiten modificar el comportamiento de funciones o métodos sin cambiar su código original. Por eso son ampliamente utilizados para añadir funcionalidad, registro de logs, control de acceso y muchas otras tareas.
La sintaxis de los decoradores en Python incluye el uso del símbolo @ antes del nombre del decorador, que se coloca antes de la definición de la función.
@decorator
def my_function():
pass
Esto es equivalente al siguiente código:
def my_function():
pass
my_function = decorator(my_function)
Piensa cuidadosamente en lo que sucede aquí: declaramos la función my_function
, pero luego la sustituimos con la función decorator
, en la que pasamos nuestra función como parámetro. La función decorator
puede invocar nuestra función a su elección.
5.2 Creación de un decorador simple
Consideremos un decorador simple que imprime un mensaje antes y después de llamar a la función.
def my_decorator(func):
def wrapper():
print("Antes de llamar a la función")
func()
print("Después de llamar a la función")
return wrapper
@my_decorator
def say_hello():
print("Hello!")
say_hello()
Explicación
Decorador (my_decorator)
: Esta función toma la función func
como argumento y devuelve una nueva función wrapper
, que llama a func
y añade comportamiento adicional antes y después de su invocación.
Función con decorador (say_hello)
: La función say_hello
está envuelta en el decorador my_decorator
, lo que añade comportamiento adicional al llamarla.
Salida:
# Antes de llamar a la función
Hello!
# Después de llamar a la función
5.3 Decoradores con argumentos
Los decoradores pueden tomar argumentos, lo que permite personalizar su comportamiento con flexibilidad.
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")
Explicación
Decorador con argumentos (repeat)
: Esta función toma el argumento num_times
y devuelve el decorador decorator_repeat
.
Decorador (decorator_repeat)
: Este decorador toma la función func
y devuelve una nueva función wrapper
, que llama a func
num_times
veces.
Función con decorador (say_hello)
: La función say_hello
se llama tres veces gracias al decorador repeat
.
Salida:
Hello, Alice!
Hello, Alice!
Hello, Alice!
GO TO FULL VERSION