1、编写装饰器,为多个函数加上认证功能(用户账号密码来源于文件),
要求:登录成功一次,后续的函数都无需再输入用户名和密码
1 import time 2 flage = True 3 def login():#登录认证(三次认证,输错三次等待15秒,再次认证) 4 j = 0 5 lis = [] 6 while j < 3: 7 j += 1 8 username = input('请输入用户名:\n').strip() 9 password = input('请输入密码:\n') 10 with open('passwd_note',mode='r',encoding='utf-8') as f: 11 for i in f: 12 lis.append(i.strip()) 13 if lis[0] == username and lis[1] == password: 14 print('认证成功!') 15 break 16 elif (3-j) == 0: 17 print('账号或密码输入错误请重新输入!您还有{}次机会,请15秒后重新输入!'.format(3-j)) 18 j = 0 19 time.sleep(15) 20 continue 21 else: 22 print('账号或密码输入错误请重新输入!您还有{}次机会'.format(3-j)) 23 24 25 def wrapper_out(flage): #装饰器 26 def wrapper(func): 27 def inner(*args,**kwargs): 28 global flage #修改全局变量申明 29 if flage:#认证通道 30 login() 31 ret = func(*args,**kwargs) 32 flage = False#修改全局变量,促使后面调用装饰器的函数直接走else,不走if 33 else:#不认证通道 34 ret = func(*args,**kwargs) 35 return ret 36 return inner 37 return wrapper 38 39 @wrapper_out(flage) # 40 def mx(a,b): 41 print(max(a,b)) 42 43 @wrapper_out(flage) # 44 def sm(a,b): 45 print(a+b) 46 47 #调用 48 mx(1,2) 49 sm(2,3)
2、编写装饰器,为多个函数加上记录调用功能,要求每次调用函数都将被调用的函数名称写入文件
1 flage = True 2 def wrapper_out(flage): #装饰器 4 def wrapper_func(func): 5 def inner(*args,**kwargs): 6 if flage: 7 ret = func(*args,**kwargs) 8 else: 9 ret = func(*args,**kwargs) 10 with open('log','a',encoding='utf-8') as f1: 11 f1.write('{}\n'.format(func.__name__)) #将调用函数的函数名的函数名写入文件 12 return ret 13 return inner 14 return wrapper_func 15 16 @wrapper_out(flage) #记录调用函数名的装饰器调用 17 def mx(a,b): 18 print(max(a,b)) 19 20 @wrapper_out(flage) 21 def sm(a,b): 22 print(a+b) 23 24 #调用 25 mx(1,2) 26 sm(2,3)