python decorator

这个也非常有意思,函数真的在python中地位很高呀,很多特性感觉都是特意为函数而设计的

decorator就是对函数的,外围的一个修改,找不到一个合适的比喻呀,可能跟细胞核,跟细胞膜的关系吧,对进入细胞核的东西,先做一个检查,或者修饰,形成一个新的整体。

最简单的例子

def first(func):

    def wrapper(*args,**kwargs):

        print 'first'

        func()

        print 'finish first'

    return wrapper

这个函数不会执行wrapper,但会返回wrapper,所以我们该怎么调用呢?

def foo():

    print 'test'

b=first(foo)

b()

这样就可以调用了,或者可以first(foo)()这样子调用,这个函数就是执行wrapper

输出的结果就是:

first

test

finish first

这样子很麻烦了,所以就有了语法糖

@first

def foo():

    print 'test'

foo()------->输出同样的结果呀,感觉不错呀

这个问题结束了又有一个更复杂的问题就是多次使用decorator会怎么样呢?

@first

@second

def foo():

    print 'test'

foo()-------?结果会怎么样呢

写一个second decorator

def second(func):

     def wrapper(*args,**kwargs):

         print 'second'

         func()

        print 'finish second'

    return  wrapper

结果是什么呢?

first
second
test
finish second
finish first

比较明显这个一个递归的样子?

其实为什么会有递归的样子呢?这个又要回到我们第一个例子中,了解他们是怎么调用wrapper,

我想应该是这样子的

先运行first------>返回了第一个wrapper--->执行地一个wrapper--->print fist-->func()但是这个时候的func到底是什么呢,所以解析器应该去使用第二个decorator--->返回第二个wrapper--->运行第二个wrapper---->print 'second' --->run func()那么这个时候的func是什么呢,肯定是foo---->print test -->继续运行print finish second --->返回到第一个wrapper中,执行func()下面的代码 ---->print finish first

 

 

 这边还碰到一个问题,就是一旦函数被wrapper就会丢失自己的一些属性,所以解决的办法就是加上@wraps

eg:

from functools import wraps

def first(func):

    @wraps

    def wrapper():

        print 'wrapper"

    return wrapper

 

posted @ 2013-09-18 14:39  Epirus  阅读(293)  评论(0编辑  收藏  举报