python2.7 decorator 实例运用体会

还是老规矩,先上代码,调试一下代码看其中不同:

demo1:

def call(*argv,**kwargs):                   #装饰器函数,参数用于增加或修改调整被装饰器函数的参数

    print 'argv=%s'%(argv)

    def call_fn(fn):                               <、调用被装饰函数 fn

        def wrapper(n):                          >、被装饰函数的参数

            return fn(*argv,**kwargs)        &、见下

         return wrapper                           *、见下

    return call_fn

@call(5)

def table(n):

    value = []

    for i in xrange(n):

        value.append(i)

    return value

print 'type(table)=%s' %(type(table))

x = table(1)

print len(x),x[3]

==================================================

运行结果:

argv=5
type(table)=
5 3

===================================================

首先我们来看下装饰器语法糖的基本定义的用法描述:

我们引用这篇文章对装饰器的定义:
A decorator is a function that takes a function object as an argument, and returns a function object as a return value.
从这个定义可知,装饰器本质上只是一个函数,它借助闭包的语法去修改一个函数(又称被装饰函数)的行为,即decorator其实是个闭包函数,该函数以被装饰函数名(这个函数名其实是一个函数对象的引用)作为入参,在闭包内修改被装。

在定义好函数装饰器的前提下,当外部调用这个被装饰函数时,decorator的语法糖会由Python解释器解释为先执行装饰器函数,然后在装饰器返回的新函数对象上继续执行其余语句。饰函数的行为后,返回一个新的函数对象。(可以通过调用 print table.__name__ 看到被装饰函数变成了 wrapper)

分析上面实例:

上面1,2 注释上有写明,

3、实际执行过程中没有,调用被装饰函数的参数,而是调用装饰函数的参数,如果我们改成return fn(n) 则table(n)中的n 将起到作用;

4 这个返回值就是新函数的返回值,可根据情况不用。(如:return 0,则 type (table)=)


今天到这啦,洗洗睡了…




posted @ 2017-05-28 23:36  先完成一个小目标  阅读(355)  评论(0编辑  收藏  举报