73. Decoradoras I
Vídeo
Notas personales
En esta lección, introduciremos el uso de las decoradoras (o funciones decoradoras), que son funciones que añaden ciertos comportamientos a otras (de ahí el nombre, puesto que las ‘‘decoran’’ incorporando funcionalidades adicionales).
La estructura de una decoradora, de forma abstracta, es la siguiente:
- Son tres funciones (
A
,B
yC
), dondeA
recibe como parámetro aB
para devolverC
. - Esto es, una decoradora devuelve siempre una función.
Su sintaxis queda como sigue:
def funcion_decoradora(funcion): # funcion_A(funcion_B)
def funcion_interna(): # funcion_C
# codigo funcion interna
return funcion_interna
Veamos su aplicación práctica mediante un ejemplo muy sencillo, en el que la utilidad de la decoradora será casi nula y nos servirá únicamente para comprender su funcionamiento, sin añadir excesiva complejidad al código fuente.
En primer lugar, tecleamos:
def suma():
print(15 + 20)
def resta():
print(30 - 10)
suma()
resta()
35
20
Acto seguido, supongamos que deseamos añadir a todas las funciones cierto comportamiento adicional. Para ello, podemos acudir a su código y modificarlas una por una (en este ejemplo son dos, pero imaginemos un caso donde hubiera cientos de funciones) o utilizar una decoradora:
def funcion_decoradora(funcion_parametro):
def funcion_interior():
# Acciones adicionales que decoran
print("Vamos a realizar un cálculo: ")
funcion_parametro()
# Acciones adicionales que decoran
print("Hemos terminado el cálculo.")
return funcion_interior
A continuación, para añadir el decorador a cualquiera de las funciones ya previamente existentes, escribimos:
@funcion_decoradora
def suma():
print(15 + 20)
def resta():
print(30 - 10)
suma()
resta()
Vamos a realizar un cálculo:
35
Hemos terminado el cálculo.
20
Notemos cómo el decorador solo afecta a la función suma()
, pues así lo hemos declarado arriba. Bastaría replicar la estrategia para decorar asimismo la función resta()
.
Código fuente
El código fuente y los posibles ficheros externos generados correspondientes a esta lección se encuentran disponibles para su consulta en la carpeta /lecciones/73/
del
repositorio.