自學Python4.5-裝飾器舉例

自學Python之路-Python基礎+模塊+面向對象
自學Python之路-Python網絡編程
自學Python之路-Python併發編程+數據庫+前端
自學Python之路-djangohtml

自學Python4.5 - 裝飾器舉例

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

FLAG = False
def 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 == 'carlos' and password == 'carlos88':
                FLAG = True
                ret = func(*args,**kwargs)      #func是被裝飾的函數
                return ret
            else:
                print('登陸失敗')
    return inner

@login
def shoplist_add():
    print('增長一件物品')

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

shoplist_add()
shoplist_del()

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

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

@log
def shoplist_add():
    print('增長一件物品')

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

shoplist_add()
shoplist_del()
shoplist_del()
shoplist_del()
shoplist_del()
shoplist_del()
 

3.  編寫下載網頁內容的函數,要求功能是:用戶傳入一個url,函數返回下載頁面的結果數據庫

     爲題目1編寫裝飾器,實現緩存網頁內容的功能:django

     具體:實現下載的頁面存放於文件中,若是文件內有值(文件大小不爲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)  #get()
        with open('web_cache','wb') as f:
            f.write(b'*********'+ret)
        return ret
    return inner

@cache
def 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) 
相關文章
相關標籤/搜索