2018年11月13日 星期二

python -day12 作業 -裝飾器

1.編寫裝飾器,為多個函數加上認證的功能(用戶的帳號密碼來源於文件)
要求登入成功一次,後續的函數都無需要在輸入用戶名和密碼

FLAG = Falsedef login(func):
    def inner(*args,**kwargs):
        global FLAG
        '''登入程式'''        if FLAG:
            ret = func(*args,**kwargs) #func是被裝飾的函數            return  ret
        else:
            username = input('username  : ')
            password = input('password  : ')
            if username  == 'boss_gold'  and password == '22222':
                FLAG = True                ret =  func(*args,**kwargs)  #func是被裝飾的函數                return   ret
            else:
                print('登入失敗')
    return  inner

@logindef shoplist_add() :
    print('增加的一件物品')

@logindef  shoplist_del() :
    print('刪除一件物品')

shoplist_add()
shoplist_del()
執行結果:
username  : boss_gold
password  : 22222
增加的一件物品
刪除一件物品



2.編寫裝飾器,為多個函數加上紀錄調用功能,要求每次調用函數都將
被調用的函數名稱寫入文件

def  log(func) :
    def inner(*args,**kwargs):
        with open('log','a',encoding='utf-8') as f :
            f.write(func.__name__+'\n')
        ret =  func(*args,**kwargs)
        return  ret
    return  inner


@logdef shoplist_add() :
    print('增加一件商品')

@logdef shoplist_del () :
    print('刪除一件物品')


shoplist_add ()

運行結果:
增加一件商品

3.編寫下載網頁內容的函數,要求功能是:用戶傳人一個url,函數返回下載頁面的結果
為題目1編寫裝飾器,實現緩存網頁內容的功能:


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

import  os
from urllib .request import  urlopen
def cache(func):
    def inner(*args,**kwargs):
        if  os.path.getsize('web_cache'):
            with open('web_cache','rb') as f:
                return  f.read()
        ret = func(*args,**kwargs) #grt()        with open('web_cache','wb') as f:
            f.write(b'***********'+ret)
        return  ret
    return  inner

@cachedef get(url):
    code = urlopen(url).read()
    return  code


ret = get('http://www.baidu.com')
print(ret)
ret = get('http://www.baidu.com')
print(ret)
ret = get('http://www.baidu.com')
print(ret)
執行結果:
#網頁代碼


















沒有留言:

張貼留言