# 解决的是返回值问题import time
defindex(username):
time.sleep(3)
return username
defouter(func_name):
defget_time(*args, **kwargs): # 可变长形参,什么数据类型都可以
start_time = time.time()
res = func_name(*args, **kwargs) # 执行真正的index函数
end_time = time.time()
print(end_time - start_time)
return res # 返回原函数的值,没有的时候返回的是nonereturn get_time
index = outer(index)
res = index('起飞')
print(res)
七、装饰器模板
# 兄弟们,这才是关键defouter(func_name): # func_name用于接收被装饰的对象(函数)definner(*args, **kwargs):
print('执行被装饰函数之前 可以做的额外操作')
res = func_name(*args, **kwargs) # 执行真正的被装饰函数print('执行被装饰函数之后 可以做的额外操作')
return res # 返回真正函数的返回值return inner
八、装饰器语法糖
# 语法糖内部原理1、使用时最好紧跟在被装饰对象上面
2、语法糖会自动将下面紧挨着的函数名床给@后面的函数调用
# 先定义一个outer函数defouter(func_name):
definner(*args, **kwargs):
print('执行函数之前的操作')
res = func_name(*args, **kwargs)
# 额外操作return res
return inner
# 使用outer直接@加outer@outer # 等价于 index = outer(index)defindex(*args, **kwargs):
print('from index')
print(index)
@outer # 等价于 home = outer(home)defhome(*args,**kwargs):
print('from home')
print(home)
九、装饰器修复技术
from functools import wraps # 固定搭配defouter(func_name):
@wraps(func_name) # wraps模块warps关键字可以把真函数的属性提取出来,赋值给装饰器,达到以假乱真的地步definner(*args, **kwargs):
print('执行被装饰对象之前可以做的操作')
res = func_name(*args, **kwargs)
return res
return inner
@outerdefhome():
'''这是函数的注释'''print('from home')
home()
print(home)
help(home)
# 结果为from home
<function home at 0x00000249C8FDFCA0>
Help on function home in module __main__:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?