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
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:
En este ejemplo, la función
myTimer
está definida para recibir un único argumento,func
, que es el método a decorar. La funciónwrapper
está definida dentro demyTimer
, y recibe cualquier número de argumentos posicionales y de palabras clave utilizando*args
y**kwargs
. Dentro dewrapper
, se registra el tiempo de inicio utilizandoperf_counter()
, luego se llama al método original con los argumentos dados utilizandofunc(*args, **kwargs)
. El resultado del método original se almacena en la variableresult
, y el tiempo transcurrido se calcula antes de imprimirlo. Finalmente, se devuelveresult
.Para decorar el método
data
de la claseExample
, se aplica el decorador@myTimer
en él. Cuando se llama ae.data()
, primero invocará la funciónwrapper
creada pormyTimer
, la cual llamará adata
, 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ónwrapper
no recibe ningún argumento, perodata
recibeself
como argumento. Para solucionar esto, necesitamos modificarwrapper
para que acepte cualquier número de argumentos y los pase al método original utilizando*args
y**kwargs
. La versión corregida demyTimer
se muestra arriba.