# # 一:编写函数,(函数执行的时间用time.sleep(n)模拟)import timedef sum(x, y): sum = x + y time.sleep(3) print(sum) return sum# # 二:编写装饰器,为函数加上统计时间的功能def timer(func): def wrapper(*args, **kwargs): start = time.time() res = func(*args, **kwargs) stop = time.time() print(stop - start) return res return wrappersum = timer(sum)sum(1,2)‘‘‘33.0039072036743164‘‘‘# 三:编写装饰器,为函数加上认证的功能def auth(func): def wrapper(*args,**kwargs): inp_name = input(‘请输入名字‘) inp_psd = input(‘请输入密码‘) with open(‘db.txt‘,‘rt‘,encoding=‘utf-8‘)as rf: info={} for line in rf: name,psd = line.strip().split(‘:‘) info[name]=psd if inp_name not in info: print(‘用户不存在‘) if inp_name in info and inp_psd==info[inp_name]: print(‘登陆成功‘) # 执行之前的sum函数 res = func(*args,**kwargs) return res else: print(‘登录失败‘) return wrappersum =auth(sum)sum(1,2)‘‘‘结果:请输入名字xilou请输入密码666登陆成功33.0051000118255615‘‘‘# 四:编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),要求登录成功一次,后续的函数都无需再输入用户名和密码# 注意:从文件中读出字符串形式的字典,可以用eval(‘{"name":"egon","password":"123"}‘)转成字典格式userstaus={‘username‘:None}#用于保存用户登录状态def auth_one(func): def wrapper(*args,**kwargs): #如果用户未登陆则登陆再使用 if userstaus[‘username‘] is None: inp_name = input(‘请输入名字‘) inp_psd = input(‘请输入密码‘) with open(‘db.txt‘,‘rt‘,encoding=‘utf-8‘)as rf: info={} for line in rf: name,psd = line.strip().split(‘:‘) info[name]=psd if inp_name not in info: print(‘用户不存在‘) if inp_name in info and inp_psd==info[inp_name]: print(‘登陆成功‘) #记录下当前用户的登录状态 userstaus[‘username‘]=inp_name #执行之前的sum函数 res = func(*args,**kwargs) return res else: print(‘登录失败‘) else: # 若之前已登录则直接进行功能使用 print(‘欢迎回来,亲爱的{}用户‘.format(userstaus[‘username‘])) res = func(*args, **kwargs) return res return wrappersum =auth(sum)sum(1,2)sum(2,3)sum(2,5)‘‘‘结果:请输入名字xilou请输入密码666登陆成功3欢迎回来,亲爱的xilou用户5欢迎回来,亲爱的xilou用户7Process finished with exit code 0‘‘‘# 五:编写装饰器,为多个函数加上认证功能,要求登录成功一次,在超时时间内无需重复登录,超过了超时时间,则必须重新登录import timeuserstaus={‘username‘:None,‘login_time‘:0}#用于保存用户登录状态def auth_time(func): def wrapper(*args,**kwargs): #若用户登录时间超过5秒则取消登录状态,即退出该用户的登录 start=time.time() if start-userstaus[‘login_time‘]>5: userstaus[‘username‘]=None #如果用户未登陆则登陆再使用 if userstaus[‘username‘] is None: inp_name = input(‘请输入名字‘) inp_psd = input(‘请输入密码‘) with open(‘db.txt‘,‘rt‘,encoding=‘utf-8‘)as rf: info={} for line in rf: name,psd = line.strip().split(‘:‘) info[name]=psd if inp_name not in info: print(‘用户不存在‘) if inp_name in info and inp_psd==info[inp_name]: print(‘登陆成功‘) #记录下当前用户的登录状态 userstaus[‘username‘]=inp_name # 记录下用户登录的时间 userstaus[‘login_time‘]=time.time() #执行之前的sum函数 res = func(*args,**kwargs) return res else: print(‘登录失败‘) else: # 若之前已登录则直接进行功能使用 print(‘欢迎回来,亲爱的{}用户‘.format(userstaus[‘username‘])) res = func(*args, **kwargs) return res return wrappersum =auth(sum)sum(1,2)sum(2,3)sum(2,5)sum(2,5)‘‘‘结果:请输入名字xilou请输入密码666登陆成功3欢迎回来,亲爱的xilou用户5请输入名字xilou请输入密码666登陆成功7欢迎回来,亲爱的xilou用户7Process finished with exit code 0‘‘‘# 六:选做题# # 思考题(选做),叠加多个装饰器,加载顺序与运行顺序,可以将上述实现的装饰器叠加起来自己验证一下# # @deco1 # index=deco1(deco2.wrapper的内存地址)# # @deco2 # deco2.wrapper的内存地址=deco2(deco3.wrapper的内存地址)# # @deco3 # deco3.wrapper的内存地址=deco3(index)# # def index():# # pass@timer@auth_timedef sum(x, y): sum = x + y time.sleep(3) print(sum) return sumsum(1,2)sum(2,2)sum(2,3)