关闭

Python 函数装饰器

196人阅读 评论(0) 收藏 举报
分类:
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)

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

参考 http://www.cnblogs.com/rhcad/archive/2011/12/21/2295507.html

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:243195次
    • 积分:7283
    • 等级:
    • 排名:第3037名
    • 原创:483篇
    • 转载:23篇
    • 译文:3篇
    • 评论:12条
    最新评论