請考慮以下代碼片段。當使用具有可調用對象的裝飾器時返回用戶定義的函數名稱
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
函數,但與裝飾print_timing
使用時暴露的__call__
內部實現細節。有沒有一種方法(也許傳遞合適的參數傳遞給__init__
功能)來改變name
對象,因此它返回,而不是
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
「'name'」類(原文與大寫字母)不是正確的解決方法,不應該使用,也不應該將修飾器放在特殊的位置。不幸的是,我們不能說正確的方法,因爲我們不知道你真的想做什麼。 – ninjagecko 2011-05-30 19:39:49