Puedes ejecutar cualquier ejemplo de esta guía directamente en nuestra consola interactiva: Abrir consola de Python →
Decoradores en Python: funciones que modifican otras funciones
Los decoradores permiten añadir funcionalidad extra a funciones sin modificar su código original. Son muy usados en frameworks como Flask, Django y FastAPI.
Tabla de contenidos
1. ¿Qué es un decorador?
Un decorador es una función que recibe otra función y devuelve una versión modificada de ella.
@mi_decorador
def funcion():
pass
2. Funciones anidadas
Los decoradores se basan en funciones dentro de funciones.
def exterior():
def interior():
print("Hola")
interior()
3. Decorador básico
def mi_decorador(func):
def envoltura():
print("Antes de ejecutar")
func()
print("Después de ejecutar")
return envoltura
@mi_decorador
def saludar():
print("Hola!")
saludar()
4. Decoradores con argumentos
def repetir(n):
def decorador(func):
def envoltura():
for _ in range(n):
func()
return envoltura
return decorador
@repetir(3)
def hola():
print("Hola")
hola()
5. Decoradores múltiples
def deco1(func):
def wrap():
print("D1")
func()
return wrap
def deco2(func):
def wrap():
print("D2")
func()
return wrap
@deco1
@deco2
def prueba():
print("Función")
prueba()
6. Ejercicios
- Crear un decorador que imprima “Inicio” y “Fin”.
- Crear un decorador que repita una función dos veces.
- Crear un decorador que reciba argumentos.
- Crear dos decoradores y aplicarlos juntos.
- Crear un decorador que mida el tiempo de ejecución.
def deco(func):
def wrap():
print("Inicio")
func()
print("Fin")
return wrap
def repetir(func):
def wrap():
func()
func()
return wrap
def deco(msg):
def wrap(func):
def run():
print(msg)
func()
return run
return wrap
@d1
@d2
def hola():
pass
import time
def medir(func):
def wrap():
inicio = time.time()
func()
print(time.time() - inicio)
return wrap
7. Mini‑proyecto: Logger de funciones
def logger(func):
def wrap(*args, **kwargs):
print(f"Ejecutando {func.__name__}")
resultado = func(*args, **kwargs)
print(f"Resultado: {resultado}")
return resultado
return wrap
@logger
def sumar(a, b):
return a + b
sumar(5, 7)
8. Preguntas frecuentes
¿Los decoradores se usan en frameworks?
Sí, en Flask, Django, FastAPI y más.
¿Puedo decorar funciones con argumentos?
Sí, usando *args y **kwargs.