案例:装饰器

 案例一:编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),要求登陆成功一次,后续的函数都无需再输入账号和密码

 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()
案例四

 

posted @ 2018-07-15 22:15  宝露  阅读(98)  评论(0)    收藏  举报