Python: Decoradores explicados con ejemplos prácticos
Entiende qué son los decoradores en Python y cómo pueden hacer tu código más limpio y reutilizable
Python: Decoradores explicados con ejemplos prácticos
Los decoradores son una característica poderosa de Python que te permite modificar el comportamiento de funciones o clases de manera elegante.
¿Qué es un decorador?
Un decorador es una función que toma otra función y extiende su comportamiento sin modificarla explícitamente.
def mi_decorador(func):
def wrapper():
print("Antes de la función")
func()
print("Después de la función")
return wrapper
@mi_decorador
def saludar():
print("¡Hola!")
saludar()
# Salida:
# Antes de la función
# ¡Hola!
# Después de la función
Decoradores con argumentos
def decorador_con_args(func):
def wrapper(*args, **kwargs):
print(f"Argumentos: {args}, {kwargs}")
resultado = func(*args, **kwargs)
print(f"Resultado: {resultado}")
return resultado
return wrapper
@decorador_con_args
def sumar(a, b):
return a + b
sumar(5, 3)
# Salida:
# Argumentos: (5, 3), {}
# Resultado: 8
Ejemplo práctico: Timer
import time
from functools import wraps
def timer(func):
@wraps(func)
def wrapper(*args, **kwargs):
inicio = time.time()
resultado = func(*args, **kwargs)
fin = time.time()
print(f"{func.__name__} tardó {fin - inicio:.4f} segundos")
return resultado
return wrapper
@timer
def proceso_lento():
time.sleep(2)
return "Completado"
proceso_lento()
# proceso_lento tardó 2.0021 segundos
Decorador de caché
from functools import lru_cache
@lru_cache(maxsize=128)
def fibonacci(n):
if n < 2:
return n
return fibonacci(n-1) + fibonacci(n-2)
print(fibonacci(100)) # Muy rápido gracias al caché
Decorador para validación
def validar_positivo(func):
def wrapper(numero):
if numero < 0:
raise ValueError("El número debe ser positivo")
return func(numero)
return wrapper
@validar_positivo
def raiz_cuadrada(n):
return n ** 0.5
print(raiz_cuadrada(16)) # 4.0
# raiz_cuadrada(-4) # ValueError
Decoradores con parámetros
def repetir(veces):
def decorador(func):
def wrapper(*args, **kwargs):
for _ in range(veces):
resultado = func(*args, **kwargs)
return resultado
return wrapper
return decorador
@repetir(veces=3)
def mensaje():
print("Hola Mundo")
mensaje()
# Hola Mundo
# Hola Mundo
# Hola Mundo
Decoradores de clase
def singleton(clase):
instancias = {}
def get_instancia(*args, **kwargs):
if clase not in instancias:
instancias[clase] = clase(*args, **kwargs)
return instancias[clase]
return get_instancia
@singleton
class Database:
def __init__(self):
print("Conectando a la base de datos")
db1 = Database() # Conectando a la base de datos
db2 = Database() # No imprime nada, usa la misma instancia
print(db1 is db2) # True
Conclusión
Los decoradores son una herramienta esencial en Python. Te permiten escribir código más limpio, modular y reutilizable, siguiendo el principio DRY (Don't Repeat Yourself).
CodeCraft Master
Desarrollador Full Stack apasionado por compartir conocimiento. Escribo sobre JavaScript, TypeScript, React y desarrollo web moderno.
Artículos Relacionados
Únete a nuestro boletín
Recibe contenido exclusivo de desarrollo web directamente en tu bandeja de entrada.
Contenido exclusivo de desarrollo web
Actualizaciones semanales
Tips y trucos
Sin spam, solo contenido de calidad
