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)=
今天到这啦,洗洗睡了…