logo cosasdedevs

Qué son los decoradores de Python

Qué son los decoradores de Python

My Profile
Jul 28, 2020

¡Hola! ¿Qué tal estáis? Para los que estamos en el hemisferio norte y más en concreto en España, estamos pasando muchoooooooooo calor. Aunque se le quitan a uno las ganas de bloguear he hecho un esfuerzo y os traigo un tutorial que tenía muchas ganas de hacer que es explicar el tema de los decoradores en Python.

Aaaaal lío.

¿Qué son los decoradores?

Un decorador es una función que recibe como parámetro una función y que retorna otra función. Esto lo utilizamos para alterar el comportamiento de una función sin tener que modificar su código. Suena un poco lioso pero nada más lejos de la realidad, voy a explicar como crear nuestro propio decorador y mostraré un ejemplo para que quede más claro.

¿Cómo crear nuestro propio decorador?

Crear un decorador es bastante sencillo, simplemente creamos una función que recibe otra función y retornamos una función de salida. Os dejo aquí un ejemplo de como crearlo:

def my_primer_decorador(function):

	def funcion_de_retorno():
		print('Cargando...')
		function()
		print('Proceso finalizado')

	return funcion_de_retorno

Este decorador recibe una función por parámetro, después dentro de él, declaramos la función de retorno donde introducimos el código que queramos ejecutar y ejecutamos la función que hemos recibido por parámetro. Por último devolvemos nuestra función de retorno (podemos llamarla como queramos).

¿Cómo utilizar nuestros decoradores?

Una vez creado el decorador, vamos a implementarlo para decorar una función. Para decorar una función deberemos añadir el prefijo @ y el nombre del decorador justo una línea antes de la función que queremos decorar. Os dejo un ejemplo para que quede más claro:

def my_primer_decorador(function):

	def funcion_de_retorno():
		print('Cargando...')
		function()
		print('Proceso finalizado')

	return funcion_de_retorno


@my_primer_decorador
def funcion_de_entrada():
	print('Hola mundo')


if __name__ == "__main__":
    funcion_de_entrada()

En este ejemplo, decoramos la función llamada función_de_entrada() que imprime el clásico mensaje de hola mundo (para que innovar xD). Al añadir el decorador y ejecutar nuestra función, lo que hará será que se ejecute la función de retorno que es la que contiene la función original. Por lo tanto los mensajes que se mostrarán por pantalla será primero el de cargando..., después él hola mundo y por el último el mensaje de proceso finalizado.

Vale vale, todo esto está muy bien, pero... ¿Y si necesitamos pasar argumentos a nuestra función, cómo va eso? No problem, te lo explico ahora mismo 👇

Pasar argumentos a una función con un decorador

En el caso que necesitemos pasar argumentos solo necesitaremos pasar los parámetros args y kwargs a la función de retorno y listo, no necesitamos nada más. Podéis verlo más claro con el siguiente ejemplo:

def calcular_area_triangulo(function):

    def funcion_de_retorno(*args, **kwargs):
        res = function(*args, **kwargs)
        return res / 2

    return funcion_de_retorno


@calcular_area_triangulo
def calcular_area(base, altura):
    return base * altura


if __name__ == "__main__":
    print(calcular_area(4, 10))

Para este ejemplo tenemos una función para calcular el área de un rectángulo que recibe como parámetros la base y la altura de este y ahora queremos modificarla pero sin tocarla para calcular el área de un triángulo. Lo que hacemos en la función de retorno del decorador es pasar los parámetros args y kwargs y los volvemos a pasar a nuestra función original para que realice su función (valga la redundancia), con el retorno de la función original lo dividimos entre dos para obtener el área del triángulo y ya devolvemos el resultado. Eso es todo lo que necesitamos a la hora de pasar parámetros.

Conclusiones

Como veis en los ejemplos es bastante sencillo implementar nuestros decoradores para mejorar nuestros proyectos, darles más funcionalidades y generar un código más limpio.

Como siempre os recuerdo que si queréis estar al tanto de cuando suba el siguiente tutorial, seguidme en Twitter, ya que ahí siempre informo de cuando subo nuevo material.

Nos leemos 👋

221 vistas

Nos tomamos en serio tu privacidad

Utilizamos cookies propias y de terceros para mejorar la experiencia del usuario a través de su navegación. Si pulsas entendido aceptas su uso. Ver política de cookies.

🐍 Sígueme en Twitter

Si te gusta el contenido que subo y no quieres perderte nada, sígueme en Twitter y te avisaré cada vez que cree contenido nuevo 💪
Luego ¡Te sigo!