python 带参数装饰器

在前面一文《python里为什么需要使用装饰器(decorator)》里,我们学习了为什么需要装饰器,知道装饰器就是为了不修改原来函数的代码,又达到增加功能的作用。其实为了装饰器更通用化,那么装饰器是否也可以带参数呢?其实是可以的,这样更加通用化了,达到共享极点。在前面也学习《为什么要使用闭包(closures)》一文,知道参数可以嵌套函数里实现隐藏,并且实现全局参数的功能,与函数一起绑定。因此只需要结合这两个知识点,就可以产生通用带参数的装饰器了。原来不带参数的代码如下:
[python] view plain copy
  1. #python 3.6  
  2. #定义一个新的函数  
  3. def printStar(func):  
  4.     def f():  
  5.         print('*************************************')  
  6.         return func()  
  7.     return f  
  8.  
  9. @printStar  
  10. def add():      
  11.     return 1 + 1  
  12.  
  13. @printStar  
  14. def sub():      
  15.     return 2 -1  
  16.       
  17. print(add())  
  18.   
  19. print(sub())  

现在再对装饰器函数进一步修改,再嵌套一层函数,实现闭包的功能,代码就修改如下:
[python] view plain copy
  1. #python 3.6  
  2. #定义一个新的函数  
  3. def title(show = ''):  
  4.     def printStar(func):  
  5.         def f():  
  6.             print(show,'*************************************')  
  7.             return func()  
  8.         return f  
  9.     return printStar  
  10.  
  11. @title('add')  
  12. def add():      
  13.     return 1 + 1  
  14.  
  15. @title('sub')  
  16. def sub():      
  17.     return 2 -1  
  18.       
  19. print(add())  
  20.   
  21. print(sub())  

输出如下:

add *************************************
2
sub *************************************
1

经过带参数的装饰器的修改,这时控制输出的内容,就更方便了。可以根据不同的函数名称来进行修改输出提示。

前面发现被装饰的函数都没有带参数,这是为了简单起见,现在来学习一下如果被装饰的函数也参数,怎么样修改呢?
可以看下面的代码:

[python] view plain copy
  1. #python 3.6  
  2. #定义一个新的函数  
  3. def title(show = ''):  
  4.     def printStar(func):  
  5.         def f(a, b):  
  6.             print(show,'*************************************')  
  7.             return func(a, b)  
  8.         return f  
  9.     return printStar  
  10.  
  11. @title('add')  
  12. def add(a, b):      
  13.     return a + b  
  14.  
  15. @title('sub')  
  16. def sub(a, b):      
  17.     return a - b  
  18.       
  19. print(add(11))  
  20.   
  21. print(sub(21))  
由两段代码相比较,可以发现函数传送参数是修改def f(a, b),就是第三层的函数。
Python中,装饰器是一种用于修改函数行为的函数。而参数装饰器就是在普通装饰器的基础上,给装饰器传递额外的参数。这样可以在装饰器内部使用这些参数来改变装饰函数的行为。 在给装饰器传递参数时,需要在装饰器函数上面再包裹一层函数来接收参数,并返回装饰器函数。例如,示例代码中的@wrapper_out('QQ')就是一个参数装饰器。 当函数执行到参数装饰器@wrapper_out('QQ')这句时,会先执行wrapper_out('QQ')这个函数,将参数'QQ'传给parameter并得到返回值wrapper函数。然后,再将@符号与wrapper函数结合,得到一个标准的装饰器,按照装饰器的执行流程来装饰函数。 通过参数装饰器,可以在装饰器内部对被装饰函数进行进一步的处理或设置,从而实现更灵活的函数装饰。这对于需要根据不同的参数来选择不同装饰方式的情况非常有用。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [python参数装饰器](https://blog.csdn.net/weixin_44799217/article/details/118695357)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* [python如何修改装饰器参数](https://download.csdn.net/download/weixin_38570854/12870003)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值