'''编写装饰器其实有一套固定的代码 不需要做任何理解'''defouter(func_name):# func_name用于接收被装饰的对象(函数) definner(*args,**kwargs):print('执行被装饰函数之前 可以做的额外操作')
res = func_name(*args,**kwargs)# 执行真正的被装饰函数 print('执行被装饰函数之后 可以做的额外操作')return res # 返回真正函数的返回值 return inner
装饰器语法糖
# 目的就是为了优化好看,内部原理:1.使用的时候最好紧跟在被装饰对象的上方。2.语法糖会自动将下面紧挨着的函数名传给@后面的函数调用defouter(func_name):definner(*args,**kwargs):print('执行函数之前的操作')
res = func_name(*args,**kwargs)# 额外操作return res
return inner
@outer# 等价于 index = outer(index)defindex(*args,**kwargs):print('from index')# index = outer(index) # 总感觉这一行代码有点low!!!@outer# 等价于 home = outer(home)defhome(*args,**kwargs):print('from home')print(index)print(home)
装饰器修复技术
from functools import wraps
defouter(func_name):@wraps(func_name)definner(*args,**kwargs):print('执行被装饰对象之前可以做的操作')
res = func_name(*args,**kwargs)return res
return inner
@outerdefindex():print('from index')@outerdefhome():'''这是home函数的注释'''print('from home')# help(home) # help可以查看指定函数的注释信息# help(len)# index() # 目前的以假乱真 有瑕疵# print(index)# help(home)# help(index)# print(home)# print(index)
home()
index()
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)