# 装饰器语法糖的作用只是让代码看起来更加好看和简介defouter(func_name):
definner(*args,**kwargs):
start_time = time.time()
res = func_name(*args,**kwargs)
end_timg = time.time()
print(end_time-start_time)
return res
return inner
@outer # 等价于 index = outer(index)defindex():
print('hello world')
'''
语法糖内部原理
使用的时候语法糖会自动将下面紧挨着的函数名传给@后面的函数调用,使用的时候最好紧挨在被装饰对象的上方
'''
装饰器修复技术
defouter(func_name):
definner(*args,**kwargs):
start_time = time.time()
res = func_name(*args,**kwargs)
end_timg = time.time()
print(end_time-start_time)
return res
return inner
@outer defindex():
print('hello world')
print(index) #<function outer.<locals>.inner at 0x000001D782E43B70>'''
不难发现,当我们打印被装饰函数时,发现,他的地址是inner()函数的地址,而装饰器修复技术就是用来解决这一问题的
'''from functools import wraps # 第一步defouter(func_name):
@wraps(func_name) # 第二步definner(*args,**kwargs):
start_time = time.time()
res = func_name(*args,**kwargs)
end_timg = time.time()
print(end_time-start_time)
return res
return inner
@outer defindex():
print('hello world')
print(index) #<function index at 0x0000019F9BEB3B70>
练习
点击展开
flag = False
d = {'jason':'123'}
defouter(func_name):
definner(*args,**kwargs):
global flag
# 如果已经登陆过,就直接执行被装饰函数if flag:
res = func_name(*args,**kwargs)
return res
# 为登录过,就进行登录else:
user_name = input('请输入用户名:').strip()
user_pwd = input('请输入密码:').strip()
if d.get(user_name) == user_pwd:
flag = True
res = func_name(*args,**kwargs)
return res
else:
print('用户名或者密码错误')
return inner
@outerdefindex(a):
print(a)
return a+1@outerdefindex2(b):
print('hello world')
return b
index(1)
index2(8)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)