Decoradores en Python
Índice
¿Que es un decorador?
Los decoradores ofrecen una manera de modificar funciones utilizando otras funciones. Esto es ideal cuando necesitas extender la funcionalidad de las funciones que no quieres modificar.
Los decoradores, altera de forma dinámica la funcionalidad de una función o método, en algunos casos inclusive de una clase sin necesitar del uso de subclase ni de cambiar el código de las funciones que se decoran.
Un decorador en Python permite extraer lógica común e implementarla en una variación de la sintaxis del lenguaje que permite una mejor lectura.
A continuación les mostrare ejemplos de decoradores para funciones y clases.
Decoradores en Forma de Función:
# Decoradores en forma de función # El nombre de la funcion es el nombre del decorador y recibe la funcion que decora (print_text). def decor(func): def wrap(): print("="*12) func() print("="*12) return wrap @decor def print_text(): print("Hola Mundo!!!") print_text()
============ Hola Mundo!!! ============
Decoradores en Forma de Clase:
# Decorador en forma de clase class logger(object): def __init__(self, fn): print ("Logger se instancia en la definicion de la funcion ") self.fn = fn def __call__(self, *args): # esta es la decoracion print ("La decoracion puede ejecutar tareas previas a la ejecucion de la funcion") for i, arg in enumerate(args): print ("arg %d:%d" % (i, arg)) # nunca olvido ejecutar funcion decorada return self.fn(*args) # Sumador va a sumar todos los argumentos enviandos, sin importar cuantos son. @logger def Sumador(*args): return sum([i for i in args]) # Ejecuto mi funcion decorada - La decoracion ya se instancio. print ("Voy a Correr el Sumador") Sumador(1,2,3,4) print ("Funcion ejecutada")
Logger se instancia en la definicion de la funcion Voy a Correr el Sumador La decoracion puede ejecutar tareas previas a la ejecucion de la funcion arg 0:1 arg 1:2 arg 2:3 arg 3:4 Funcion ejecutada
Decoradores con Argumentos:
Un decorador también puede recibir parámetros, de manera que pueda modificar su funcionalidad de acuerdo a algún valor diferente para cada decoración.
# Decoradores con Argumentos def logger(debug=False): def _logger(func): def inner(*args, **kwargs): if debug: print ("Estoy corriendo en modo debug") for i, arg in enumerate(args): print ("arg %d:%s" % (i, arg)) func(*args, **kwargs) return inner return _logger @logger(True) # la decoracion esta en modo debug def Yo_me_llamo(nombre, apellido): print ("Yo me llamo %s" % nombre) Yo_me_llamo("Luis", "Salcedo")
Estoy corriendo en modo debug arg 0:Luis arg 1:Salcedo Yo me llamo Luis
Encadenando Decoradores:
Los decoradores trabajan en forma independiente y por tanto se puede aplicar múltiples decoradores a una misma función que se ejecutaran en forma consecutiva.
# Encadenando Decoradores AUTHENTICATED = True def autenticado(f): def inner(*args, **kwargs): print ("Yo autentico") if AUTHENTICATED: f(*args, **kwargs) else: raise Exception return inner def aviso(f): def inner(*args, **kwargs): print ("Yo aviso") f(*args, **kwargs) print ("Se ejecuto %s" % f.__name__) return inner @autenticado @aviso def abrir_puerta(): print ("Abrir la puerta") @aviso @autenticado def cerrar_puerta(): print ("Cerrar la puerta") abrir_puerta() cerrar_puerta()
Yo autentico Yo aviso Abrir la puerta Se ejecuto abrir_puerta Yo aviso Yo autentico Cerrar la puerta Se ejecuto inner
Recuerda que en el Blog puede encontrar una gran cantidad de infromación referente a Python. En Mi Diario Python puedes Aprender Python de manera muy fácil.
¿Alguna duda? No olvides dejar un comentario.
Mi nombre es Luis y fue un placer compartir mis conocimientos con todos ustedes :D.
-
Buenísimo
-
Muy buen material, realmente me ayudó a entender lo básico de los operadores
-
Excelente!
Deja una respuesta
hello, excellent