随笔 - 86  文章 - 5  评论 - 11  阅读 - 10万 

1、作用

利用装饰器,可以在不修改已有函数的情况下向已有函数中注入代码,使其具备新的功能。
 
2、特点
一个装饰器可以为多个函数注入代码,一个函数也可以注入多个装饰器的代码。
 
3、优点
利用装饰器可以将日志处理、执行时间计算等较为通用的代码注入到不同的函数中,从而使得代码更加简洁
 
4、Demo1
复制代码
 1 def deco1(func): #定义函数deco1 
 2     def inner1(*args, **kwargs): #定义函数inner1 
 3         print('deco1 begin') 
 4         func(*args, **kwargs) 
 5         print('deco1 end') 
 6     return inner1 #返回函数inner1的引用
 7 @deco1 
 8 def f1(a,b): #定义函数f1 
 9     print('a+b=',a+b) 
10 @deco1 
11 @deco2 
12 def f2(a,b,c): #定义函数f2 
13     print('a+b+c=',a+b+c) 
14 if __name__=='__main__': 
15     f1(3,5) #调用f1函数 
16     f2(1,3,5) #调用f2函数
17 print('deco1 begin') 
18 print('a+b=',a+b) 
19 print('deco1 end')
20 print('deco1 begin') 
21 print('deco2 begin') 
22 print('a+b+c=',a+b+c) 
23 print('deco2 end') 
24 print('deco1 end')
复制代码

输出:

deco1 begin
a+b= 8
deco1 end
deco1 begin
deco2 begin
a+b+c= 9
deco2 end
deco1 end
 
Demo2
复制代码
 1 def deco1(func): #定义函数deco1 
 2     def inner1(x,y): #定义函数inner1 
 3         print('deco1 begin') 
 4         func(x,y) 
 5         print('deco1 end') 
 6     return inner1 #返回函数inner1的引用 
 7 def deco2(func): #定义函数deco2 
 8     def inner2(): #定义函数inner2 
 9         print('deco2 begin') 
10         func() 
11         print('deco2 end') 
12     return inner2 #返回函数inner2的引用 
13 @deco1 
14  def f1(a,b): #定义函数f1 
15      print('a+b=',a+b) 
16 @deco2 
17 def f2(): #定义函数f2 
18     print('f2 is called') 
19 if __name__=='__main__': 
20     f1(3,5) #调用f1函数 
21     f2() #调用f2函数   
22 print('deco1 begin') 
23 print('a+b=',a+b) 
24 print('deco1 end')  
25 print('deco2 begin') 
26 print('f2 is called') 
27 print('deco2 end')              
复制代码

注意:deco1只能用于装饰带两个参数的函数,而deco2只能用于装饰没有参数的函数。

输出:deco1 begin

   a+b= 8
   deco1 end
   deco2 begin
   f2 is called
   deco2 end
 
posted on   史振兴  阅读(110)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示