关于装饰器的一些小练习

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)

猜你喜欢

转载自www.cnblogs.com/kindvampire/p/10310796.html
今日推荐