我正在尝试编写一个Python装饰器,它将存储函数在实例属性中运行的时间。
代码:
from functools import wraps
import time
def time_func(func):
""" Decorator to log the time func takes to run."""
@wraps(func)
def _dec(self, *args, **kwargs):
if not hasattr(self, '__func_times'):
self.__func_times = {}
t0 = time.time()
ret = func(self, *args, **kwargs)
t1 = time.time()
self.__func_times[func.__name__] = (t1 - t0)
return ret
return _dec
class Foo(object):
def __init__(self):
self.__func_times = {}
@time_func
def f1(self):
sleep_time = 1
print "f1 sleeping {} sec".format(sleep_time)
time.sleep(sleep_time)
def f1_time(self):
print "inside _last_func_time:{}".format(self.__func_times.get('f1'))
print "__func_times: {}".format(self.__func_times)
return self.__func_times.get('f1')
当我运行f()方法时,我可以立即看到__func_times dict具有装饰器设置的值。
>>> f = Foo()
>>> f.f1()
f1 sleeping 1 sec
>>> f.__func_times
{'f1': 1.0000121593475342}
但是当我运行f1_times()方法时,它会将字典视为空,并且不会返回任何内容。
>>> print f.f1_time()
inside _last_func_time: None
__func_times: {}
None
>>>
出了什么问题?