Fundamentos de los Decoradores de Python

PythonPythonBeginner
Practicar Ahora

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

Los decoradores en Python te permiten modificar o mejorar el comportamiento de una función, clase o método. Son una forma de alterar dinámicamente la funcionalidad de tu código sin cambiar el código fuente. En este laboratorio, exploraremos los conceptos básicos de los decoradores y cómo utilizarlos para agregar funcionalidad a tu código.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL python(("Python")) -.-> python/AdvancedTopicsGroup(["Advanced Topics"]) python(("Python")) -.-> python/FunctionsGroup(["Functions"]) python/FunctionsGroup -.-> python/function_definition("Function Definition") python/FunctionsGroup -.-> python/scope("Scope") python/AdvancedTopicsGroup -.-> python/decorators("Decorators") subgraph Lab Skills python/function_definition -.-> lab-76{{"Fundamentos de los Decoradores de Python"}} python/scope -.-> lab-76{{"Fundamentos de los Decoradores de Python"}} python/decorators -.-> lab-76{{"Fundamentos de los Decoradores de Python"}} end

Comprendiendo los Decoradores

Comencemos con un ejemplo simple. Abra una nueva sesión del intérprete de Python:

python3

Tenemos una función que calcula el cuadrado de un número:

def square(x):
    return x**2

Ahora digamos que queremos agregar una característica a la función square que registre la entrada y salida de la función cada vez que se llama. Podemos hacer esto utilizando un decorador.

Aquí está el código para el decorador logger:

def logger(func):
    def wrapper(x):
        print("Llamando a la función:", func.__name__)
        print("Entrada:", x)
        result = func(x)
        print("Salida:", result)
        return result
    return wrapper

Ahora podemos utilizar este decorador para mejorar la función square:

@logger
def square(x):
    return x**2

Cuando llamamos a square(5), la salida será:

Llamando a la función: square
Entrada: 5
Salida: 25

Como puede ver, el decorador ha agregado la funcionalidad deseada a la función square sin cambiar su código fuente.

Decoradores con Parámetros

Los decoradores también pueden aceptar parámetros. Por ejemplo, podríamos modificar el decorador logger para aceptar un mensaje que se imprimirá antes de los registros de entrada y salida.

def logger(message):
    def decorator(func):
        def wrapper(x):
            print(message)
            print("Llamando a la función:", func.__name__)
            print("Entrada:", x)
            result = func(x)
            print("Salida:", result)
            return result
        return wrapper
    return decorator

Ahora podemos utilizar este decorador actualizado para mejorar la función square:

@logger("This is a custom message")
def square(x):
    return x**2

Cuando llamamos a square(5), la salida será:

This is a custom message
Llamando a la función: square
Entrada: 5
Salida: 25

Usando Varios Decoradores

También puedes apilar varios decoradores uno encima del otro para agregar múltiples niveles de funcionalidad. Por ejemplo, creemos un nuevo decorador llamado timer que mide el tiempo que tarda en ejecutarse una función:

import time

def timer(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print("Tiempo transcurrido:", end_time - start_time)
        return result
    return wrapper

Ahora usemos los decoradores logger y timer en la función square:

@logger("This is a custom message")
@timer
def square(x):
    return x**2

Cuando llamamos a square(5), la salida será:

This is a custom message
Llamando a la función: square
Entrada: 5
Salida: 25
Tiempo transcurrido: 0.000001

Como puedes ver, el decorador timer ha agregado la información de tiempo transcurrido a la función square, mientras que el decorador logger ha agregado los registros de entrada y salida y el mensaje personalizado.

Resumen

En este laboratorio, hemos aprendido los conceptos básicos de los decoradores en Python. Hemos visto cómo utilizar los decoradores para modificar el comportamiento de una función, clase o método, y cómo utilizar varios decoradores para agregar múltiples niveles de funcionalidad. También hemos visto cómo utilizar decoradores con parámetros para agregar funcionalidad personalizada.

Con estas habilidades, ahora puedes comenzar a incorporar decoradores en tu código para facilitar tu vida como desarrollador.