Blog
Entender el concepto de los decoradores y aprender a usarlos
Decoradores en Python
Un decorador es básicamente un patrón de diseño. Estos alteran de forma dinámica la funcionalidad de una función, un método o una clase, sin necesidad de añadir subclases o modificar el código fuente de la clase que se desea decorar.
En otras palabras los decoradores hacen posible que una función o clase (A) tome como argumento otra función (B) a fin de de volver una tercera función (C). Todo esto sin necesidad de cambiar el código fuente.
La utilidad de estos decoradores es hacer un código más limpio y autocompletarlo.
Ejemplo práctico (Función sin argumento)
Para explicar como se utiliza comenzaremos creando una función simple y luego la iremos decorando.
# Función simple def mensaje(): print("Python es el mejor lenguaje")
Esta función mostrará en pantalla el mensaje “Python es el mejor lenguaje”.
Ahora procederemos a decorar, haciendo otra función a la que denominaremos “decorador”.
# Decorador def decorador(funcion_a_decorar): def complemento(): funcion_a_decorar() print("Con Unipython programar es fácil") return complemento
Con estas líneas de código hemos creado el decorador. Este tomará como argumento la función a decorar (mensaje) para luego retornar la nueva función (complemento) definida dentro del decorador.
Este decorador lo que hace es añadir un texto después de la ejecución de la función “mensaje”.
Para aplicarlo a la función que queremos decorar podemos procedemos a utilizar el símbolo @ seguido del nombre de la función decoradora
@decorador def mensaje(): print("Python es el mejor lenguaje")
El uso del @ es lo mismo que escribir “mensaje=decorador(mensaje)”
De esta forma la función “decorador” tomara a la función “mensaje” como argumento, para luego retornar la función “complemento” el cual incluirá una linea de texto después del primer mensaje. Por lo tanto se imprimirá en pantalla lo siguiente:
Python es el mejor lenguaje
Con Unipython programar es fácil
Ejemplo práctico (Función con argumento)
Ahora veamos como realizar nuestro decorador para modificar una función que necesite recibir argumentos. Para este ejemplo, haremos una función sencilla denominada “Resta”.
# Función simple def Resta(num1, num2): return (num1 - num2) resultado=Resta(25,10) print(resultado)
Con esta sencilla función hemos automatizado una resta cuyos operandos serán pasados como argumentos a la función.
Ahora crearemos su correspondiente decorador.
# Decorador def decorador(funcion_a_decorar): def texto(*args, **kwargs): print("Efectuando la Resta") resultado=funcion_a_decorar(*args, **kwargs) return resultado return texto
Como hemos visto, hemos creado un decorador con una estructura similar al ejemplo anterior, salvo que en este caso la función que retorna (texto) recibe como argumentos los valores de la función original, introduciendo por convención “*args” y “**kwargs” a fin de introducir los argumentos y variables en la nueva función.
También creamos una variable denominada “resultado” aplicada de la misma forma que función Resta, sobre los valores que definiremos posteriormente. Esta aplicación se generará durante la ejecución de la nueva función (texto) que es la que retornará al final el decorador que hemos creado.
# Decorador def decorador(funcion_a_decorar): def texto(*args, **kwargs): print("Efectuando la Resta") resultado=funcion_a_decorar(*args, **kwargs) return resultado return texto # Aplicando el decorador a una función con argumentos @decorador def Resta(num1,num2): return num1-num2
Después de haber creado nuestro decorador, lo aplicamos sobre la función decorada (Resta). Esta a su vez recibe como argumentos las variables num1 y num2.
Lo que falta es visualizar el resultado aportando a las variables num1 y num2 sus valores correspondientes.
# Decorador def decorador(funcion_a_decorar): def texto(*args, **kwargs): print("Efectuando la Resta") resultado=funcion_a_decorar(*args, **kwargs) return resultado return texto # Aplicando el decorador a una función con argumentos @decorador def Resta(num1,num2): return num1-num2 # Mostrando el resultado en pantalla resultado=Resta(25,10) print(resultado)
Al ejecutar el programa obtendremos el siguiente resultado
Efectuando la Resta
15
➡ Ahora ya puedes utilizar Decoradores en tus proyectos de Python,
aprende más con nuestro Curso de Python para Principiantes: