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__+' ') #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)