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)

以前不理解装饰器, 慢慢练习写写,从简单,到复杂,慢慢就有感觉了。