2 回答

TA貢獻1794條經驗 獲得超7個贊
您在實例方法上應用裝飾器,因此此裝飾方法綁定的實例將作為第一個參數傳入,self您可以在其中找到您要查找的實例屬性,因此您只需從參數中提取,在下面的示例中self命名wrapped_self:
def __call__(self, wrapped_self, *args, **kwargs):
tic = time.time()
func_return = self.__wrapped__(wrapped_self, *args, **kwargs)
tac = time.time()
total_time = round((tac - tic) / 60, 2)
print(f'Operation Time: {total_time} min.')
print(wrapped_self.test_attr)
return func_return

TA貢獻1818條經驗 獲得超11個贊
“self”是 do_something 函數的第一個參數。
所以你可以在你的裝飾器中明確地識別它。 wrapped將是裝飾類實例,*args并將包含所有其他位置參數。
from functools import wraps
import types
import time
class TimeDecorator():
def __init__(self, func):
wraps(func)(self)
def __call__(self, wrapped, *args, **kwargs):
tic = time.time()
func_return = self.__wrapped__(wrapped, *args, **kwargs)
tac = time.time()
total_time = round((tac - tic) / 60, 2)
print(f'Operation Time: {total_time} min.')
print(wrapped.test_attr)
return func_return
def __get__(self, instance, cls):
if instance is None:
return self
else:
return types.MethodType(self, instance)
class A():
def __init__(self):
self.test_attr = 0
@TimeDecorator
def do_something(self):
time.sleep(1) # example of stuff only...
a = A()
a.do_something()
添加回答
舉報