1. 程式人生 > >python----------裝飾器應用練習

python----------裝飾器應用練習

pla spa opened lose 多個 hdd lib 列表 -s

1.編寫裝飾器,為多個函數加上認證的功能(用戶的賬號密碼來源於文件),
要求登錄成功一次,後續的函數都無需再輸入用戶名和密碼
註意:從文件中讀出字符串形式的字典,可以用eval(‘{"name":"egon","password":"123"}‘)
轉成字典格式
技術分享
 1 定義一個字典看用戶登錄狀態
 2 auth_status={
 3     user:None,
 4     status:False#狀態是沒有登錄
 5 }
 6 def wrapper(fun):
 7     def inner(*args,**kwargs):
 8         if auth_status[
status]:#如果登錄了,就執行fun函數 9 ret = fun(*args, **kwargs) # index/home 10 return ret 11 else:#如果沒有登錄,就實現認證功能 12 username = input(name:>>).strip()#獲取用戶名 13 password = input(password:>>).strip()#獲取密碼 14 f=open(login.txt,
r,encoding=utf-8)#打開文件獲取用戶的信息 15 user_dic=f.read()#讀出來的是字符串類型 16 zhddict=eval(user_dic)#轉換成字典類型 17 #print(type(zhddict))#查看eval轉換後的類型 18 if zhddict.get(username) and password == zhddict[username]:#如果用戶名和密碼都正確,就顯示登陸成功,不正確就顯示登錄失敗 19 print
(login successful) 20 auth_status[user]=username #登陸成功後就把用戶名放在user裏 21 auth_status[status]=True 狀態改為True 22 ret = fun(*args,**kwargs)#index/home 23 return ret 24 else: 25 print(login faild) 26 return inner 27 @wrapper #語法糖 28 def index(): 29 print("歡迎來到首頁") 30 31 @wrapper 32 def home(): 33 print("歡迎回家") 34 35 index() 36 index() 37 home() 38 index()
View Code

2.編寫下載網頁內容的函數,

要求功能是:用戶傳入一個url,函數返回下載頁面的結果

編寫裝飾器,實現緩存網頁內容的功能:

具體:實現下載的頁面存放於文件中,如果文件內有值(文件大小不為0),就優先從文件中讀取網頁內容,

否則,就去下載,然後存到文件中


技術分享

 1 from urllib.request import urlopen
 2 url_l=[]#存放
 3 def huancun(func):
 4     ‘‘‘
 5         實現緩存網頁內容的功能
 6     ‘‘‘
 7     def inner(*args,**kwargs):#args傳的就是url,那麽得到url就得用url = args[0]
 8         url = args[0]  # 取url
 9         filename=str(hash(url))#用hash算法吧url轉換為數字作為文件名,但是數字不能作為文件名,必須轉換成str類型
10         if url in url_l:#如果url已經在列表裏了,就說明你已經下載過了,就不需要在執行func了,就直接打開就行了
11             f=open(filename,rb)
12             ret=f.read()
13         else:#如果不在列表裏就要把添加到url列表
14             url_l.append(url)
15             ret = func(*args, **kwargs)
16             f=open(filename,wb)#打開文件
17             f.write(ret)#並且用寫的方式把它寫進文件裏
18         f.close()
19         return ret
20     return inner
21 
22 
23 @huancun#get=huancun(get)
24 def get(url):#定義一個get函數
25     return urlopen(url).read()#返回讀取的網頁
26 print(get(http://www.people.com.cn))
27 print(get(http://www.people.com.cn))#調用get方法,傳一個‘http://www.people.com.cn‘網址進去
28 print(get(http://www.people.com.cn))
View Code

 

python----------裝飾器應用練習