本文依然是个人随笔,所以一些地方没有写的很详细。
书接上篇文章。所以我们还是以上篇的代码为例
代码段是上篇的代码,新增加了一个方法
# 创建闭包,需要传入一个参数(函数名)
def set_func(func):
def call_func():
print('----这里是权限验证1----')
func()
return call_func
# 普通需要修改的函数
@set_func # 装饰器实现 等价于代码片段二中的test1 = set_func(test1)
def test1():
print('---这里是test1的方法体内容---')
# 普通需要修改的函数
@set_func # 装饰器实现
def test2():
print('---这里是test2的方法体内容---')
test1()
test2()
上面代码段运行之后,是两个测试函数都会输出一样的装饰器内容。现在我们希望和实际工作一样,每个测试函数可以进行不同的权限校验,即test1函数加了装饰器之后打印“这里是权限校验1”,test2函数加了装饰器之后打印“这里是权限校验2”。
依据开发“开放封闭”原则,原始函数test1和test2我们肯定是不能做任何的修改的,就只能在装饰器上面做手脚。因为级别都是装饰器被调用之后确定的,也就是说实际工作开发中,等级的确定都是对方调用我们接口之后传进来,所以我们只需要在装饰器后面预留出来传参的位置即可,代码如下
@set_func(预留参数位置) # 装饰器实现,等同于 test1 = set_func(test1)
def test1():
print('---这里是测试函数的函数体---')
上篇我们解释装饰器实现原理的时候写过,装饰器实现相当于重新定义了test1,即test1=set_func(test1),而且我们在定义闭包的时候set_func已经是需要传参的,现在这种写法就不适用。
那在保持原有闭包不变的前提下,再增加进去一个参数,该如何实现呢?答案就是将闭包在封装到另一个闭包中
这样当外层闭包运行完之后就会调用我们原有的闭包
"""
创建闭包,将原有的闭包函数封装起来,作用是为了预留参数位置
当闭包被调用之后会连同参数传入,执行外层return之后会调用函数set_func
即@set_level(1) 执行之后结果会变成 @set_func,逻辑又再次回到了之前的
装饰器原理上,但同时保留有带入的参数1,执行完内存闭包set_func运行逻辑之后
就可以实现对应的分级的效果
"""
# 创建闭包,需要传入一个参数(函数名)
def set_level(level):
def set_func(func):
def call_func():
if level ==1:
print('----这里是权限验证1----')
func()
elif level == 2:
print('---这里是权限验证2---')
func()
return call_func
return set_func
# 在调用的时候我们就需要用新的闭包来替换原有的闭包
# 普通需要修改的函数
# @set_func # 装饰器实现 等价于代码片段二中的test1 = set_func(test1)
@set_level(1)
def test1():
print('---这里是test1的方法体内容---')
@set_level(2)
def test2():
print('---这里是test2的方法体内容---')
test1()
test2()