装饰器
介绍
是Python的一个重要组成部分,可以有效的增强一个函数的功能。
可以在不修改原函数的情况下对其进行功能扩展,遵循开放封闭原则
举个栗子
要给好多个index函数添加验证,
常规的做法如下,显然违反了封闭原则,并且实施起来也比较困难。
def verification():
print("验证代码逻辑")
def index1():
#验证
verification()
print("index1....")
def index2():
#验证
verification()
print("index2....")
...
def indexn():
#验证
verification()
print("indexn....")
装饰器初体验
def verify(func):
def run():
print("权限验证逻辑")
func()
return run
@verify
def index1():
print("index1....")
@verify
def index2():
print("index2....")
index1()
index2()
运行结果:
权限验证逻辑
index1....
权限验证逻辑
index2....
原理分析
以index2()为例
装饰 @verify 实际上等价于 index2 = verify(index2)
前面的index2 表示一个变量,用于指向后面函数的引用,可以用任意变量接收
后面的index2 表示def index2()这个函数引用
通过原函数名index2 接收的原因是为了不影响函数调用
即整个调用逻辑是:
index2 = verify(index2)
index2() # 所以通过装饰器扩展原函数时,只需要添加装饰器函数即可,不需要更改调用
验证
可以将index对应的装饰过程改造如下:
def verify(func):
def run():
print("权限验证逻辑")
func()
return run
def index2():
print("index2....")
#调用逻辑如下
index2 = verify