Python之旅:装饰器
装饰器就是闭包函数的一种应用场景
一、为何要用装饰器#
开放封闭原则:软件一旦上线后,就应该遵循开放封闭原则,即对修改源代码是封闭的,对功能的扩展是开放的
也就是说我们必须找到一种解决方案:能够在不修该一个功能源代码以及调用方式的前提下,为其加上新功能
上述总结,原则如下:
1、不修改源代码
2、不修改调用方式
目的:
在遵循1和2原则的基础上扩展新功能
二、什么是装饰器#
器指的工具,装饰指的是为被装饰对象添加新功能
完整含义:
装饰器即在不修改被装饰对象源代码与调用方式的前提下,为被装饰器对象添加新功能
装饰器与被装饰的对象均可以是任意可调用的对象
装饰器=》函数
被装饰的对象=》函数
三、无参装饰器#
#无参装饰器模板 def outer(func): def inner(*args,**kwargs): res=func(*args,**kwargs) return res return inner

1 ###现在我们要查看指令执行的时间 2 #以前实现的方式 3 #违反了装饰器的原则---》不修改源代码 4 import time #导入时间模块 5 6 def index(): 7 start_time=time.time() #现在时间 8 time.sleep(3) #暂停3s 9 print('welcome to index page') 10 stop_time=time.time() #现在的时间(time.sleep与print执行完后的时间) 11 print('run time is %s' %(stop_time-start_time)) 12 13 index() #调用函数 14 15 #修订1 16 #没有违背原则,但是我又要给一个程序加一个同样的这样的功能呢?会体现出现在的代码重复 17 import time 18 19 def index(): 20 time.sleep(3) 21 print('welcome to index page') 22 23 start_time=time.time() 24 index() 25 stop_time = time.time() 26 print('run time is %s' % (stop_time - start_time)) 27 28 #但是我又要给一个程序加一个同样的这样的功能呢?会体现出现在的代码重复 29 30 import time 31 32 def index(): 33 time.sleep(3) 34 print('welcome to index page') 35 36 def home(name): 37 time.sleep(5) 38 print('welcome %s to home page' %name) 39 40 start_time=time.time() #代码重复 41 index() 42 stop_time = time.time() #代码重复 43 print('run time is %s' % (stop_time - start_time)) #代码重复 44 45 start_time=time.time() 46 home('egon') 47 stop_time = time.time() 48 print('run time is %s' % (stop_time - start_time)) 49 50 #修订2 51 52 # 修改了原函数的调用方式 53 54 import time 55 56 def index(): 57 time.sleep(3) 58 print('welcome to index page') 59 60 def home(name): 61 time.sleep(5) 62 print('welcome %s to home page' %name) 63 64 def wrapper(func): #func=index 65 start_time=time.time() 66 func() #index() 67 stop_time = time.time() 68 print('run time is %s' % (stop_time - start_time)) 69 70 71 wrapper(index) # 修改了原函数的调用方式 72 73 #修订3 74 75 import time 76 77 def index(): 78 time.sleep(3) 79 print('welcome to index page') 80 81 def outter(func): #func=最原始的index 82 # func=最原始的index 83 def wrapper(): 84 start_time=time.time() 85 func() 86 stop_time=time.time() 87 print(stop_time-start_time) 88 return wrapper 89 90 91 index=outter(index) # 新的index=wrapper 92 93 index() #wrapper()
四、无参装饰器升级版#
import time def index(): time.sleep(1) print('welcome to index page') return 122 def home(name): time.sleep(2) print('welcome %s to home page' %name) #==============装饰器 def timmer(func): #func=最原始的home def wrapper(*args,**kwargs): start_time=time.time() res=func(*args,**kwargs) #调用最原始的home stop_time=time.time() print(stop_time-start_time) return res return wrapper index=timmer(index) # 新的index=wrapper home=timmer(home) #新的home=wrapper # ========================================== # res=index() #res=wrapper() # print(res) home(name='egon') #wrapper('egon') index() #wrapper()
五、装饰器语法#
#就是一个@调用某个装饰器
import time def timmer(func): def wrapper(*args,**kwargs): start_time=time.time() res=func(*args,**kwargs) stop_time=time.time() print(stop_time-start_time) return res return wrapper @timmer #index=timmer(index) #语法调用方式 def index(): time.sleep(1) print('welcome to index page') return 122 @timmer # home=timmer(home) #语法调用方式 def home(name): time.sleep(2) print('welcome %s to home page' %name) # index() home('egon')
六、认证装饰器实现#
#
七、叠加多个装饰器#
#
#
八、有参数装饰器#
作者: 墨颜丶
出处:https://www.cnblogs.com/moyand/p/8673022.html
版权:本文采用「署名-非商业性使用-相同方式共享 4.0 国际」知识共享许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端