es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

cómo utilizar el decorador en un método de clase

cómo usar decorador en un método de clase

import time


def myTimer(func, *args, **kwargs):
    def wrapper():
        start = time.perf_counter()
        func(*args, **kwargs)
        elapsed_time = time.perf_counter() - start
        print(elapsed_time)

    return wrapper


class Example:
    def __init__(self):
        pass

    @myTimer
    def data(self):
        return [i for i in range(10000)]


e = Example()
e.data()

Resultado = TypeError: wrapper() toma 0 argumentos posicionales pero se le entregó 1

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para utilizar un decorador en un método de clase en Python, puedes definir el decorador como una función que recibe el método como argumento, crea y devuelve una función envoltorio, y luego decora el método reemplazándolo con la función envoltorio. Aquí tienes un ejemplo:

    import time
    
    def myTimer(func):
        def wrapper(*args, **kwargs):
            start = time.perf_counter()
            result = func(*args, **kwargs)
            elapsed_time = time.perf_counter() - start
            print(elapsed_time)
            return result
        return wrapper
    
    class Example:
        def __init__(self):
            pass
    
        @myTimer
        def data(self):
            return [i for i in range(10000)]
    
    e = Example()
    e.data()
    

    En este ejemplo, la función myTimer está definida para recibir un único argumento, func, que es el método a decorar. La función wrapper está definida dentro de myTimer, y recibe cualquier número de argumentos posicionales y de palabras clave utilizando *args y **kwargs. Dentro de wrapper, se registra el tiempo de inicio utilizando perf_counter(), luego se llama al método original con los argumentos dados utilizando func(*args, **kwargs). El resultado del método original se almacena en la variable result, y el tiempo transcurrido se calcula antes de imprimirlo. Finalmente, se devuelve result.

    Para decorar el método data de la clase Example, se aplica el decorador @myTimer en él. Cuando se llama a e.data(), primero invocará la función wrapper creada por myTimer, la cual llamará a data, medirá el tiempo que tarda en ejecutarse, y luego devolverá su resultado.

    Sin embargo, el código original en la pregunta produce un TypeError porque la función wrapper no recibe ningún argumento, pero data recibe self como argumento. Para solucionar esto, necesitamos modificar wrapper para que acepte cualquier número de argumentos y los pase al método original utilizando *args y **kwargs. La versión corregida de myTimer se muestra arriba.

Comments are closed.