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
披荆斩棘,仗剑天涯
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于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最大的设计失误
· 单元测试从入门到精通