装饰器是程序开发中经常会用到的功能,用好装饰器,可以让开发效率提高不少。装饰器的使用来加深不同模块之间的联系,并减少冗余代码。比如基础平台负责底层的功能,业务部门使用基础功能时,只需要调用基础平台提供的功能即可。当基础平台需要添加功能(对基础平台的所有功能进行重构)时,使用装饰器可以比较好的实现。
比如基础平台提供的功能如下:
def f1():
print('f1')
def f2():
print('f2')
def f3():
print('f3')
在所有的功能中需要添加验证功能(新的需求)时,可以先写一个函数,然后让这些f1、f2、f3去执行这个函数。但是这样并不完美。写代码应遵循开放封闭原则,虽然这个原则是用于面向对象开发,但也用于函数式编程,换句话即实现的功能代码不允许被修改,但可以拓展。原则上是不允许在f1、f2、f3的内部进行修改代码。这样可以使用装饰器来进行更改。
def w1(func):
def inner():
#验证
#...
func()
return inner
@w1
def f1():
print('f1')
@w1
def f2():
print('f2')
@w1
def f3():
print('f3')
即实现了上述需求
Python解释器会从上到下解释代码:
1 def w1(func): 将w1函数加载到内存
2 @w1 @函数名是python中的一种语法糖,先执行w1函数,然后返回w1的返回值。
对于装饰器,它实现的功能比较常用的有:
1.引入日志 2.函数执行时间统计 3.执行函数前预备处理 4.执行函数后清理功能 5.权限校验等场景 6.缓存
装饰器代码总结:
#定义函数,完成包裹数据
def makeBold(fn):
def wrapped():
return "<b>" + fn() + "</b>"
return wrapped
#定义函数,完成包裹数据:
def makeItalic(fn):
def wrapped():
return "<i>" + fn() +"</i>"
return wrapped
@makeBold
def test1():
return "hello world-1"
@makeItalic
def test2():
return "hello world-2"
@makeBold
@makeItalic
def test3():
return "hello world-3"
print(test1())
print(test2())
print(test3())
结果为
<b>hello world-1</b>
<i>hello world-2</i>
<b><i>hello world-3</i></b>