Google+ Seguidores

domingo, 17 de junio de 2018

Decoradores en Python

¿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. 

Resultado de imagen para decoradores python

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.


2 comentarios :
Write comentarios

Tu comentario es importante y nos motiva a seguir escribiendo...

Powered by Blogger .