一直懵逼装饰器到底是个啥东东,先研究了他2种简单的用法,这里分享下。
无参数的装饰器
# coding:utf8
def zhuangshiqi(func):
print '我是装饰器'
return func
@zhuangshiqi
def hanshu():
print '我是一个函数'
写好这段代码后,直接Run一下,发现终端输出了我是装饰器
我们知道在python代码执行的时候会把所有的一级代码加载到内存中去,装饰器的就是在装饰器下放的函数被加载的时候插了个队,让自己被运行一次,之后再加载原本的函数。
注意这里有运行和加载,加载是指没有被调用,当运行脚本的时候要将一级代码加载到内存中(这里指顶头写的函数)
运行,明确要运行某个函数,装饰器装饰到函数上时,只要函数想被加载或者被调用装饰器都会运行一次。
所以可以理解为什么我们定义的hanshu
没有被控制执行,但装饰器却被执行了
# coding:utf8
def zhuangshiqi(func):
print '我是装饰器'
return func
@zhuangshiqi
def hanshu():
print '我是一个函数'
hanshu()
修改代码,加上执行hansu
的过程,然后运行
我是装饰器
我是一个函数
发现运行的结果多了我是一个函数,且注意是装饰器先运行,函数后运行,所以这里就可以理解为装饰器就是一个特殊的函数,装饰到某个函数之前时,只要这个函数被调用,装饰器就会执行。
有参数的装饰器
def zhuangshiqi(func):
def exe(*args,**kwargs):
print 'start zhuangshiqi'
func(*args,**kwargs)
print 'stop zhuangshiqi'
return exe
@zhuangshiqi
def hanshu(a,b=3):
print(a,b)
写好代码后,同样的Run一下,发现这次啥都没有输出,是说上面说的观点不正确吗?不是的,是由于我们定义的装饰器中没有默认可以执行的项,而装饰器中的exe
函数只有在被装饰的hanshu
执行时才会被执行到。
def zhuangshiqi(func):
def exe(*args,**kwargs):
print 'start zhuangshiqi'
func(*args,**kwargs)
print 'stop zhuangshiqi'
return exe
@zhuangshiqi
def hanshu(a,b=3):
print(a,b)
hanshu(1,2)
添加上hanshu
执行后我们再运行,可以看到结果变了
start zhuangshiqi
(1, 2)
stop zhuangshiqi
相当于,装饰器先拿到了hanshu
的参数,装饰器内的函数exe
是用来传递hanshu
的参数的,在hanshu
被运行的时候,装饰器内的exe
函数也运行,故输出了start zhuangshiqi
和stop zhuangshiqi
,执行的过程中func
就是hanshu
本身,func
执行的时候通过装饰器的传递拿到了自己的参数,在这个过程中,装饰器可以实现在被装饰的函数执行前和执行后读做一些事情
网友评论