2 回答
TA贡献1794条经验 获得超8个赞
您在实例方法上应用装饰器,因此此装饰方法绑定的实例将作为第一个参数传入,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()
添加回答
举报
