次のコード フラグメントを検討してください。
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