Las decoraciones en Python son una herramienta poderosa que nos permite modificar el comportamiento de las funciones o de las clases. Los decoradores se crean definiendo una función que toma otra función como argumento. Vamos a detallarlo a continuación.
Un decorador es una función de orden de superior (una función que toma otra función y extiende el comportamiento de esta última sin modificarla explícitamente). Es una potente forma de cambiar y mejorar el comportamiento de una función o método existente, añadiendo cierta funcionalidad antes, después o incluso alrededor del código original.
Vamos a ver cómo podemos crear un decorador. Para comprender cómo funciona, se necesita saber que en Python, las funciones son ciudadanos de primera clase, es decir, pueden ser pasadas como argumentos a otras funciones, pueden ser devueltas por otras funciones y pueden ser definidas dentro de otras funciones.
def mi_decorador(funcion):
def envoltorio():
print("Esto se añade antes de la ejecución de la función.")
funcion()
print("Esto se añade después de la ejecución de la función.")
return envoltorio
def mi_funcion():
print("Esta es mi función.")
mi_funcion = mi_decorador(mi_funcion)
mi_funcion()
En este ejemplo, mi_decorador
es una función de orden superior porque toma como argumento otra función, mi_funcion
. Internamente define y luego devuelve otra función (envoltorio
), que es una versión modificada de mi_funcion
. Cuando ejecutas mi_funcion
, ahora ves el comportamiento modificado: las líneas de los mensajes adicionales antes y después del mensaje de mi_funcion
.
Debe notarse que la respuesta "Usando la sintaxis @decorator sobre una función" es a medias correcta. Esta sintaxis es un atajo para aplicar el decorador a una función, equivalente a mi_funcion = mi_decorador(mi_funcion)
. Pero solo aplica el decorador a la función, no lo crea.
Los decoradores pueden ser una forma poderosa y eficaz de agregar funcionalidades comunes a varias funciones y métodos en su código, lo que ayuda a adherirse al principio DRY (Don't Repeat Yourself) y hace que el código sea más fácil de mantener y de entender.