Python装饰器
装饰器到底是什么?简言之,python装饰器就是用于拓展原来函数功能的一种函数,这个函数的特殊之处在于它的返回值也是一个函数,使用python装饰器的好处就是在不用更改原函数的代码前提下给函数增加新的功能。
先来看一个例子:
#!/usr/bin/env python
# -*- coding:utf8 -*-
# @Time : 2018/4/18 10:50
# @Author : hantong
# @File : 20180418_1.py
def start(func):
print("************start*************")
func()
print("************end***************")
return func
@start
def myfunc():
print("****myfunc****")
myfunc()
执行结果:
************start*************
****myfunc****
************end***************
****myfunc****
上例中是最简单的装饰器的例子,我使用语法糖@来装饰函数,那么如果我在代码结尾再加上一个myfunc(),其结果也只是打印myfunc()函数自己的部分,不会再次调用start函数的部分,实际上这里@start相当于myfunc=start(myfunc),记住这一句非常关键。在这里需要在解释一下的是,上面那个函数是装饰函数,下面是被装饰的函数,所以执行结果会先把装饰函数的结果打印出来,再来打印被装饰函数的执行结果,并且这个装饰器可以被多个函数调用,就是说加入下面再定义一个函数,还可以通过@start再调用这个装饰器。
上例中只能调用一次装饰器,那么如果我们想多次调用装饰器呢,请看下例:
#!/usr/bin/env python
# -*- coding:utf8 -*-
# @Time : 2018/4/18 13:56
# @Author : hantong
# @File : 20180418_2.py
def start(func):
def hello():
print("************start*************")
func()
print("************end***************")
return hello
@start
def myfunc():
print("****myfunc****")
return 'ok'
myfunc()
myfunc()
执行结果:
************start*************
****myfunc****
************end***************
************start*************
****myfunc****
************end***************
从执行结果可以看出,装饰器中的函数被执行了两次。代码部分请注意装饰器中有个内嵌函数,正是这个内嵌函数才避免了我们不用手动再执行一次就可以得到执行两次的效果
未完待续。。。。。。。。。