案例:装饰器
案例一:编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),要求登陆成功一次,后续的函数都无需再输入账号和密码
1 # 装饰器案例 2 # 案例一:编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),要求登陆成功一次,后续的函数都无需再输入账号和密码 3 Flag = False 4 def login(func): 5 def inner(*args, **kwargs): 6 global Flag 7 '''登陆程序''' 8 if Flag: 9 ret = func(*args, **kwargs) 10 return ret 11 else: 12 username = input('请输入用户名:') 13 password = input('请您输入密码:') 14 if username == 'admin' and password == 'admin': 15 Flag = True 16 ret = func(*args, **kwargs) 17 return ret 18 else: 19 print('登陆失败') 20 return inner 21 22 @login 23 def shoplist_add(): 24 print('增加一件物品') 25 26 @login 27 def shoplist_del(): 28 print('删除一件物品') 29 30 shoplist_add() 31 shoplist_del()
案例二:编写装饰器,将函数调用记录在文件
1 import time 2 from time import strftime,asctime,ctime,gmtime,mktime 3 from functools import wraps 4 def his(f): 5 @wraps(f) 6 def inner(*args, **kwargs): 7 with open('调用日志.txt', 'a', encoding='utf-8') as file: 8 file.write(strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())) + '\n' 9 + '调用函数:' + f.__name__ + '\n' + '\n') 10 return f(*args, **kwargs) 11 return inner 12 13 @his 14 def usr_num(): 15 print('好的') 16 @his 17 def usr_nu1(): 18 print('123') 19 usr_num() 20 usr_nu1()
案例三:编写装饰器,下载网页存入文件,文件已有内容就不下载,但是要读取文件内容
1 import os 2 from urllib.request import urlopen 3 def cache(func): # 装饰器函数 4 def inner(*args, **kwargs): 5 if os.path.getsize('web_cache'): # 判断文件是否存在内容,存在就读出 6 with open('web_cache', 'rb') as f: 7 return f.read() 8 ret = func(*args, **kwargs) # 不存在内容执行如下代码,写入文件 9 with open('web_cache', 'wb') as f: 10 f.write(b'***' + ret) # 写入文件的同时,打上*标记 11 return ret 12 return inner 13 14 @cache 15 def get(url): 16 code = urlopen(url).read() 17 return code 18 19 ret = get('http://www.baidu.com') 20 print(ret) 21 22 ret = get('http://www.baidu.com') 23 print(ret) 24 25 ret = get('http://www.baidu.com') 26 print(ret)
案例四:带参数的装饰器,可以控制装饰器对函数的启用与关闭。三层嵌套
1 # 带参数的装饰器 2 3 import time 4 Flag = True # True执行装饰器,False关闭装饰器 5 6 def timmer_out(flag): 7 def timmer(func): 8 def inner(*args, **kwargs): 9 if Flag: 10 start = time.time() 11 ret = func(*args, **kwargs) 12 end = time.time() 13 print(end-start) 14 return ret 15 else: 16 ret = func(*args, **kwargs) 17 return ret 18 return inner 19 return timmer # 最外层再把装饰器的名字返回回去,这是标准格式 20 21 @timmer_out(Flag) 22 def wahaha(): 23 time.sleep(0.1) 24 print('娃哈哈') 25 26 @timmer_out(Flag) 27 def swaiwai(): 28 time.sleep(0.1) 29 print('爽歪歪') 30 31 wahaha() 32 swaiwai()

浙公网安备 33010602011771号