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('请输入用户名:
').strip()
9 password = input('请输入密码:
')
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('{}
'.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)