1:编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),

   要求登录成功一次,后续的函数都无需再输入用户名和密码

 1 def wrapper(func):
 2     def inner(*args,**kwargs):
 3         print('欢迎加入我们的网站!')
 4         func()
 5         print('点击此链接跳转!')
 6     return inner
 7 
 8 @wrapper
 9 def register():
10     with open('user_file', mode='r+',encoding='utf-8') as f:
11         f.write('{} {}'.format(username,password))
12 
13 @wrapper
14 def log_in():
15      with open('user_file',mode='r',encoding='utf-8') as f1:
16         user_data = f1.readline()
17      i = 1
18      while i <= 3:
19          usn = input('请输入您的用户名:')
20          pwd = input('请输入您的密码:')
21          if user_data.split()[0].strip() == username and user_data.split()[1].strip() == pwd:
22              print('Welcome!')
23              break
24          else:
25              print('用户名或密码错误,请再输入一次您的用户名和密码!您还有{}次输入机会'.format(3-i))
26              i += 1
27              continue
28 
29 
30 username = input('请输入您注册的用户名:')
31 password = input('请输入您的注册用户名密码:')
32 register()
33 log_in()

官方答案:

 1 FLAG = False                      #为了使后续的函数都无需再输入用户名和密码
 2 def login(func):
 3     def inner(*args,**kwargs):
 4         global FLAG
 5         if FLAG == True:
 6             ret = func(*args,**kwargs)                   #func是被装饰的函数
 7             return ret
 8         else:
 9             username = input('>>>username:')
10             password = input('>>>password:')
11             if username == 'xzb' and password == '123456':
12                 FLAG = True
13                 ret = func(*args,**kwargs)                 #func是被装饰的函数
14                 return ret
15             else:
16                 print('登录失败!')
17     return inner
18 
19 @login
20 def shoplist_add():
21     print('增加一件商品!')
22 
23 @login
24 def shoplist_del():
25     print('删除一件商品!')
26 
27 shoplist_add()
28 shoplist_del()

2.编写装饰器,为多个函数加上记录调用功能,要求每次调用函数都将被调用的函数名称写入文件

 1 def log(func):
 2     def inner(*args,**keargs):
 3         with open('log',mode='a',encoding='utf-8') as f:
 4             f.write(func.__name__+'\n')              #func.__name__获取函数名字
 5         ret = func(*args,**keargs)
 6         return ret
 7     return inner
 8 
 9 @log
10 def shoplist_add():
11     print('增加一件商品!')
12 
13 @log
14 def shoplist_del():
15     print('删除一件商品!')
16 
17 shoplist_add()
18 shoplist_del()

3.编写下载网页的函数,要求功能时:用户传入一个url,函数返回下载页面的结果,

如果文件内有值,就优先从文件中读取网页内容,否则就去下载

 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'):        #os.path.getsize()判断内容是否为空
 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)        #这个地方要注意,ret是bytes类型,所以前面加的字符串也要是bytes类型
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 ret = get('http://www.baidu.com')  ##
22 print(ret)

 

posted on 2018-07-20 21:28  铁子  阅读(197)  评论(0编辑  收藏  举报