函数修饰符@(decorator)
这个东西不错,用起来有点像java里的interceptor(希望我还没记错……好久没写java了),但是其实有很高的自由度。
看了看代码,其原理应该是用输入的函数对象构成一个新函数(当然也可以不用这个输入的对象,实现一个完全代码无关的函数!),然后返回这个新函数,于是每次原函数调用时,运行的其实是新函数的函数体。应该还是很好懂的。for example:
import time
def rec_proc_time(func):
# 生成的新函数
def modified_func(*arg, **args):
start_time = time.clock()
# 新函数里使用了原函数 - 也可以不使用
r = func(*arg, **args)
print "function {%s}" % (func.__name__,), \
"Process time:", time.clock() - start_time, "sec"
# 这里新函数的返回值就使用原函数的返回值 - 也可以不使用
return r
# 然后返回这个新函数,于是每次调用原函数时,会使用替代的新函数体。
return modified_func
更新:带参数的修饰符
def redir_stdin(input_file_path=default_input_file_path): # argument list.
def real_redir_stdin(func): # now its the real decorator.
def modified_func(*arg, **args):
oldstdin = sys.stdin
inputfile = open(input_file_path, 'r')
sys.stdin = inputfile
r = func(*arg, **args)
sys.stdin = oldstdin
return r
return modified_func
return real_redir_stdin