考虑以下代码片段。
def print_timing(func):
import time
def wrapper(*args, **kwargs):
t1 = time.time()
res = func(*args, **kwargs)
t2 = time.time()
print '%s took %0.3f s ~ %0.0f min and %0.1f sec' % (func.func_name, t2-t1, int(t2 - t1)/60, (t2-t1) % 60 )
return res
return wrapper
@print_timing |
def foo(): |
return 'foo'
class name(object):
def __init__(self, name):
self.name = name
@print_timing
def __call__(self):
return self.name
bar = name("bar")
print bar()
这将返回:
__call__ took 0.000 s ~ 0 min and 0.0 sec
bar
该对象的bar
行为类似于一个名为 的函数,但在与装饰器一起使用时bar
会公开内部实现细节。有没有办法改变对象(也许通过将合适的参数传递给函数)所以它返回__call__
print_timing
name
__init__
bar took 0.000 s ~ 0 min and 0.0 sec
? 我想要一个让print_timing
装饰器继续使用普通功能的解决方案。运行
print foo()
给
foo took 0.000 s ~ 0 min and 0.0 sec
foo