Python:访问通过装饰器设置的类属性

时间:2017-03-24 23:09:59

标签: python

我正在尝试编写一个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
>>>

出了什么问题?

0 个答案:

没有答案