---------------------------务必掌握----------------------------defouter(func):definner(*args,**kwargs):print('执行函数前可以添加的额外功能')
res = func(*args,**kwags)# 执行被装饰的函数print('执行函数之后可以添加的额外功能')return res # 将被装饰函数执行之后的返回值返回return inner
装饰器语法糖
defouter(func_name):definner(*args,**kwargs):print('执行被装饰对象之前可以做的额外操作')
res = func_name(*args,**kwargs)# 执行被装饰的函数print('执行被装饰对象之后可以做的额外操作')return res # 将被装饰的函数执行之后的返回值返回return inner
'''
语法糖会自动将下面紧挨着的函数名当做第一个参数自动传给@函数调用
'''@outer# 相当于 func = outer(func)deffunc():print('from func')return'func''''
装饰器语法糖书写规范
语法糖必须紧贴着在被装饰对象的上方
装饰器语法糖内部原理
会自动将下面紧贴着的被装饰对象名字当做参数传给装饰器函数调用
'''@outer# 相当于 index = outer(index)defindex():print('from index')return'index'
func()
index()
练习
# 编写一个用户认证装饰器# 函数:register login transfer withdraw# 基本要求# 执行每个函数的时候必须先校验身份 eg: jason 123# 拔高练习(有点难度)# 执行被装饰的函数 只要有一次认证成功 那么后续的校验都通过
is_flag =Falsedefouter(func):definner(*args,**kwargs):global is_flag
if is_flag ==False:
user =input('校验用户>>>:').strip()
pwd =input('校验密码>>>:').strip()if user =='jason'and pwd =='123':
is_flag =True
res = func(*args,**kwargs)return res
elif is_flag ==True:
res = func(*args,**kwargs)return res
return inner
@outerdefregister():whileTrue:
name =input('请注册您的用户名>>>:').strip()
password =input('请创建您的密码>>>').strip()withopen(r'z.txt','r', encoding='utf8')as read_f:for read_line in read_f:
name1, pwd1 = read_line.split('|')if name1 == name:print('用户已存在')breakelse:withopen(r'z.txt','a', encoding='utf8')as write_f:
write_f.write(f'{name}|{password}\n')return'注册成功'@outerdeflogin():
user_name =input('请输入您的用户名>>>:').strip()
user_pwd =input('请输入您的密码>>>:').strip()withopen(r'z.txt','r', encoding='utf8')as read_f:for line in read_f:
real_name, real_pwd = line.split('|')if user_name == real_name and user_pwd == real_pwd.strip('\n'):return'登入成功'return'用户名或密码错误'@outerdeftransfer():print('转账功能')return'转账成功'@outerdefwithdraw():
balance =100whileTrue:
withdraw_money =int(input('请输入您要提现的金额>>>:'))if withdraw_money <= balance:print(f'提现成功 剩余余额{balance - withdraw_money}')return'提现成功'else:print(f'余额不足 {withdraw_money}提现不了')continue
func_dict ={'1': register,'2': login,'3': transfer,'4': withdraw}whileTrue:print('''
1.注册功能
2.登入功能
3.转账功能
4.提现功能
''')
choice =input('请输入功能项>>>:').strip()if choice in func_dict:
index = func_dict.get(choice)()print(index)else:print('无该功能项')
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!