有参装饰器实现原理——手动实现有参装饰器

本文依然是个人随笔,所以一些地方没有写的很详细。

书接上篇文章。所以我们还是以上篇的代码为例

 

 

代码段是上篇的代码,新增加了一个方法

# 创建闭包,需要传入一个参数(函数名)
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()
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值