装饰器应用
1.编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件), 要求登录成功一次,后续的函数都无需再输入用户名和密码 注意:从文件中读出字符串形式的字典,可以用eval('{"name":"morgana","password":"123"}') 转成字典格式
定义一个字典看用户登录状态 auth_status={ 'user':None, 'status':False#状态是没有登录 } def wrapper(fun): def inner(*args,**kwargs): if auth_status['status']:#如果登录了,就执行fun函数 ret = fun(*args, **kwargs) # index/home return ret else:#如果没有登录,就实现认证功能 username = input('name:>>').strip()#获取用户名 password = input('password:>>').strip()#获取密码 f=open('login.txt','r',encoding='utf-8')#打开文件获取用户的信息 user_dic=f.read()#读出来的是字符串类型 zhddict=eval(user_dic)#转换成字典类型 #print(type(zhddict))#查看eval转换后的类型 if zhddict.get(username) and password == zhddict[username]:#如果用户名和密码都正确,就显示登陆成功,不正确就显示登录失败 print('login successful') auth_status['user']=username #登陆成功后就把用户名放在user里 auth_status['status']=True 状态改为True ret = fun(*args,**kwargs)#index/home return ret else: print('login faild') return inner @wrapper #语法糖 def index(): print("欢迎来到首页") @wrapper def home(): print("欢迎回家") index() index() home() index()
2.编写下载网页内容的函数, 要求功能是:用户传入一个url,函数返回下载页面的结果 编写装饰器,实现缓存网页内容的功能: 具体:实现下载的页面存放于文件中,如果文件内有值(文件大小不为0),就优先从文件中读取网页内容, 否则,就去下载,然后存到文件中
from urllib.request import urlopen url_l=[]#存放 def huancun(func): ''' 实现缓存网页内容的功能 ''' def inner(*args,**kwargs):#args传的就是url,那么得到url就得用url = args[0] url = args[0] # 取url filename=str(hash(url))#用hash算法吧url转换为数字作为文件名,但是数字不能作为文件名,必须转换成str类型 if url in url_l:#如果url已经在列表里了,就说明你已经下载过了,就不需要在执行func了,就直接打开就行了 f=open(filename,'rb') ret=f.read() else:#如果不在列表里就要把添加到url列表 url_l.append(url) ret = func(*args, **kwargs) f=open(filename,'wb')#打开文件 f.write(ret)#并且用写的方式把它写进文件里 f.close() return ret return inner @huancun#get=huancun(get) def get(url):#定义一个get函数 return urlopen(url).read()#返回读取的网页 print(get('http://www.people.com.cn')) print(get('http://www.people.com.cn'))#调用get方法,传一个'http://www.people.com.cn'网址进去 print(get('http://www.people.com.cn'))