from functools import wraps
defouter(func_name):@wraps(func_name)# 只是为了让别人不容易发现这个函数被装饰过definner(*args,**kwargs):print('被装饰对象执行前可添加的功能')
res = func_name()print('被装饰对象执行后可添加的功能')return res
return inner
@outerdeffn():passprint(fn)# <function fn at 0x000001CFA02CBA60>
练习
from functools import wraps
"""
1.编写一个用户认证装饰器
基本要求
执行每个函数的时候必须先校验身份 eg: jason 123
拔高练习(有点难度)
执行被装饰的函数 只要有一次认证成功 那么后续的校验都通过
函数:register login transfer withdraw
提示:全局变量 记录当前用户是否认证
"""
user_dict ={'xm':'123','xh':'321'}
flag =0whileTrue:defouter(function):@wraps(function)definner(*args,**kwargs):global flag
ifnot flag:
user_name =input('请输入用户名:').strip()if user_name notin user_dict:print('用户不存在')return
pass_word =input('请输入密码:').strip()ifnot user_dict[user_name]== pass_word:print('密码错误')return
res = function(*args,**kwargs)
flag =1return res
return inner
@outerdefregister():print('注册功能')@outerdeflogin():print('登录功能')@outerdeftransfer():print('转账功能')@outerdefwithdraw():print('取款功能')
func_dict ={'1': register,'2': login,'3': transfer,'4': withdraw}
choise =input("""
1.注册
2.登录
3.转账
4.取钱
请选择:
""").strip()if choise in func_dict:
func_dict[choise]()else:print('输入有误')