Escritura de decoradores personalizados
Cree decoradores mediante funciones wrapper y functools.wraps.
Escritura de decoradores personalizados es una lección gratuita de Python Academy en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Python Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Python Academy incluye 4 lecciones en total.
Introducción
¿Qué es un decorador?
def shout(func):
def wrapper(*a, **kw):
result = func(*a, **kw)
return str(result).upper()
return wrapper
@shout
def greet(name): return f'hello {name}'
print(greet('Alice'))El patrón wrapper
def timer(func):
import time
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
print(f'{func.__name__} took {time.time()-start:.4f}s')
return result
return wrapper
@timer
def slow(): import time; time.sleep(0.01)
slow()functools.wraps
from functools import wraps
def log(func):
@wraps(func)
def wrapper(*a, **kw):
print(f'calling {func.__name__}')
return func(*a, **kw)
return wrapper
@log
def add(a, b): return a + b
print(add.__name__)
add(1, 2)Decorador con argumentos
def repeat(n):
def decorator(func):
from functools import wraps
@wraps(func)
def wrapper(*a, **kw):
for _ in range(n): func(*a, **kw)
return wrapper
return decorator
@repeat(3)
def hi(): print('hi')
hi()Apilamiento de decoradores
def bold(f):
from functools import wraps
@wraps(f)
def w(*a,**k): return '<b>' + f(*a,**k) + '</b>'
return w
def italic(f):
from functools import wraps
@wraps(f)
def w(*a,**k): return '<i>' + f(*a,**k) + '</i>'
return w
@bold
@italic
def text(): return 'hello'
print(text())Decorador basado en una clase
class Counter:
def __init__(self, func): self.func,self.count=func,0
def __call__(self, *a, **kw):
self.count+=1
return self.func(*a, **kw)
@Counter
def greet(name): return f'hi {name}'
greet('Alice'); greet('Bob')
print(greet.count)Decorador de memoización
from functools import lru_cache
@lru_cache(maxsize=None)
def fib(n):
if n < 2: return n
return fib(n-1) + fib(n-2)
print(fib(30))Decorador de autorización
def requires_auth(func):
from functools import wraps
@wraps(func)
def wrapper(user, *a, **kw):
if not user.get('authenticated'):
raise PermissionError('Not authenticated')
return func(user, *a, **kw)
return wrapper
@requires_auth
def dashboard(user): return 'Welcome!'
try: dashboard({'authenticated': False})
except PermissionError as e: print(e)Decorador de reintento
import random
from functools import wraps
def retry(times=3):
def dec(func):
@wraps(func)
def wrapper(*a, **kw):
for i in range(times):
try: return func(*a, **kw)
except Exception as e:
if i==times-1: raise
return wrapper
return dec
@retry(3)
def flaky():
if random.random()<0.7: raise ValueError
return 'ok'
try: print(flaky())
except ValueError: print('failed')Buenas prácticas para decoradores
from functools import wraps
def validate_positive(func):
@wraps(func)
def wrapper(x, *a, **kw):
if x <= 0: raise ValueError(f'{x} must be positive')
return func(x, *a, **kw)
return wrapper
@validate_positive
def sqrt(x): return x**0.5
print(sqrt(9))Comprobación rápida
Resumen
Siga avanzando
Preguntas frecuentes
¿La lección «Escritura de decoradores personalizados» es gratis?
Sí — el texto completo de «Escritura de decoradores personalizados» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Python Academy, actualiza a CoddyKit PRO. El curso de Python Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Escritura de decoradores personalizados»?
Cree decoradores mediante funciones wrapper y functools.wraps. Practicas Python Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Python Academy?
No se requiere experiencia previa. Python Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.
¿Cuánto tiempo toma la lección «Escritura de decoradores personalizados»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Python Academy?
Sí. Cada lección de Python Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Funciones como objetos de primera clase
- Escritura de decoradores personalizados
- El decorador @property
- @classmethod y @staticmethod