from time import ctime,sleep
def tsfunc(func):
def wrappedFunc(a):
print '[%s] %s() called, a= %s ' % (ctime(), func.__name__, a)
return func()
return wrappedFunc
@tsfunc
def foo():
print "doci daci"
foo(3)
sleep(2)
foo(4)
函数装饰器,就是修饰,修改一个函数,有点像AOP编程。
首先foo是一个函数 。
其实tsfunc也是另一个函数,
使用@符号时候,就相当于是调用了tsfunc 这个函数,同时参数就是foo。
可以看到tsfunc接受一个参数。
它的目的,是生成另一个函数。在tsfunc内部,名字叫wrappedFunc, 它返回了wrappedFunc。
所以应该定义wrappedFunc。
其实,现在foo已经不是foo了,foo传进了tsfunc中,返回的是wrappedFunc。
相当于
foo=tsfunc(foo),
在之后,foo的使用者, 要使用foo的时候,要看着wrappedFunc的参数来使用了。
tsfunc就像是 函数熔炉。重炼了。
当装饰器有参数时,相当于,熔炉,首先要重炼。所以生成的函数就又多了一层。如下所示。
from time import ctime,sleep
def tsfunc(arg):
def ts_ts_func(func):
def wrappedFunc(a):
print '[%s] %s() called, a= %s, arg=%s ' % (ctime(), func.__name__, a, arg)
return func()
return wrappedFunc
return ts_ts_func
@tsfunc("123")
def foo():
print "doci daci"
foo(3)
sleep(2)
foo(4)
以前不理解装饰器, 慢慢练习写写,从简单,到复杂,慢慢就有感觉了。