Con decorador nos referimos usualmente a un patron de diseno que altera en una forma dinamica, la funcionalidad de una funcion o metodo, en algunos casos inclusive de una clase sin necesitar del uso de subclases ni de cambiar el codigo de las funciones que se decoran.
Pueden encontrar informacion del Patron Decorador en los siguientes links:
Cuando hablamos de los decoradores en python, no se implementa exactamente como lo describe incialmente el Patron Decorator, aunque su implementacion si es muy similar a la implementacion de otros lenguajes tales como c# o java.
Un decorador en python permite extraer logica comun e implementarla en una variacion de la sintaxis del lenguaje que permite una facil adecion y al mismo tiempo tiempo una mejor lectura.
Es importante entender que la meta no es sobre escribir o modificar la logica que la clase que se decora, la meta se puede decir es agregar un paso extra a la ejecucion de una funcion o la declaracion de un objeto. Permitiendo ejecutar tareas previas o posteriores a la ejecucion e inclusive manipular parametros y el resultado. Sin embargo, la forma de que el decorador se implementa, transfiere la responsabilidad de la ejecucion de la funcion decorada, al decorador mismo. Por lo que no se debe olvidar siempre llamar la funcion recibida por parametro que se quiere decorar.
Los siguientes ejemplos son decoraciones de diferentes tipos, una compilacion de varios ejemplos que he encontrado y que me parecen apropiados.
Decorador en forma de funcion
Estas clases vienen de este ejemplo, mientras investigaba sobre el tema lo encontre, me parece concreto y corto. SOlo lo cambie un poco para hacerlo aun mas claro.
Decorador en forma de clase
Decoradores con Argumentos
Un decorador tambien puede recibir parametros, de manera que pueda modificar su funcionalidad de acuerdo a algun valor diferente para cada decoracion.
Noten una tercera anidacion en las definiciones para capturar en cada capa los parametros del decorador, el nombre de la funcion y los argumentos de la funcion decorada. Noten tambien que si si no envio alguno de los parametros este no estara presente ni tendra valor en el momento del decorado. Aunque la funcion defina un valor default, ya que este es asignado posterior al llamado del decorador.
Interceptando el retorno de la funcion decorada
Dado que la ejecucion de la funcion se ejecuta desde el decorador, esto te permite examinar su respuesta, ya sea para inspeccionarlo o cambiarlo.
Encadenando Decoradores
Los decoradores trabajan en forma independiente y por tanto se puede aplicar multiples decoradores a una misma funcion que se ejecutaran en forma consecutiva.