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 @wrapper14 def log_in():15 with open('user_file',mode='r',encoding='utf-8') as f1:16 user_data = f1.readline()17 i = 118 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 break24 else:25 print('用户名或密码错误,请再输入一次您的用户名和密码!您还有{}次输入机会'.format(3-i))26 i += 127 continue28 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 = True13 ret = func(*args,**kwargs) #func是被装饰的函数14 return ret15 else:16 print('登录失败!')17 return inner18 19 @login20 def shoplist_add():21 print('增加一件商品!')22 23 @login24 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 @log10 def shoplist_add():11 print('增加一件商品!')12 13 @log14 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 ret12 return inner13 14 @cache15 def get(url):16 code = urlopen(url).read()17 return code18 19 ret = get('http://www.baidu.com')20 print(ret)21 ret = get('http://www.baidu.com') ##22 print(ret)