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. 

    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.

    1. fjmurillov dice:

      hello, excellent

    2. Unknown dice:

      Buenísimo

    3. naisui dice:

      Muy buen material, realmente me ayudó a entender lo básico de los operadores

    4. Unknown dice:

      Excelente!

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

    Subir

    Te has suscrito correctamente al boletín

    Se produjo un error al intentar enviar tu solicitud. Inténtalo de nuevo.

    Mi Diario Python will use the information you provide on this form to be in touch with you and to provide updates and marketing.