摘要:普通裝飾器函數計算函數的運行時間黑名單過濾測試網絡請求的響應時間初始裝飾閉包函數判斷的路徑是否存在,如果不存在,則追加已取消下載此已在黑名單中獲取開始請求的時間執行時間返回一個包裝函數包裝被裝飾函數的參數列表開始
普通裝飾器函數
計算函數的運行時間
import requests import time import re # 黑名單 filter_urls = ["www.hao123.com", "www.baidu.com", "www.jd.com"] def filter_url(url): # 過濾url print(url) host = re.findall(r"http[s]?://(.*?)/", url)[0] return host in filter_urls # 測試網絡請求的響應時間 def check_runtime(func): print("--初始裝飾--", func.__name__) def wrapper(url, *args, **kwargs): # 閉包函數 # 判斷url的 / path路徑是否存在,如果不存在,則追加/ if url[7:].find("/") == -1 or url[8:].find("/") == -1: url += "/" if filter_url(url): print("---已取消下載--:此url已在黑名單中") return # 獲取開始請求的時間 start_time = time.time() # result = func(*args, **kwargs) result = func(url, *args, **kwargs) delta_seconds = round(time.time() - start_time, 5) print("[執行時間%.5f]" % delta_seconds) return result return wrapper # 返回一個包裝函數(包裝被裝飾函數的參數列表) @check_runtime def request(url): print("--開始請求--", url) resp = requests.get(url) print("--響應--", resp.status_code) print(resp.content) print("---完成請求---") request("http://www.hao123.com")帶參數裝飾器函數
帶參數裝飾器
設定權限(表) 8 查詢(QUERY) 4 增加(ADD) 2 刪除(DELETE) 1 修改(UPDATE) 0 無(NOSET)
設定角色——權限 admin 15(8421) | default, 8
設置用戶-角色 disen: admin | cici: default
假如當前session中登錄的用戶是cici,其權限值為8
import time current_rights = 8 # 當前登錄用戶的權限值 PERMISSION = (("QUERY", 8), ("ADD", 4), ("DELETE", 2), ("UPDATE", 1), ("NOSET", 0)) def get_permission(permission): # 根據權限名,返回權限值 for item in PERMISSION: if permission in item: return item[1] def check_permission(permission): print("--驗證權限--", permission) def wrapper1(func): print("--初始化裝飾函數--") def wrapper2(*args, **kwargs): # 檢查當前用戶的權限 permission_value = get_permission(permission) # print(permission_value) if current_rights & permission_value != permission_value: print("當前用戶沒有權限") return result = func(*args, **kwargs) return result return wrapper2 return wrapper1 @check_permission("DELETE") def delete_order(id): print("當前用戶 cici 正在刪除訂單:", id) time.sleep(2) print("刪除成功!") def add_permission(permission): # 添加權限 global current_rights current_rights |= get_permission(permission) # add_permission("DELETE") delete_order(1010111)不帶參數的裝飾器類
class Check(): def __init__(self, func): self.func = func def __call__(self, *args): self.func(*args) @Check def login(uid): print(uid)
被裝飾的方法會傳遞給裝飾器的構造器(__init__),然后在被裝飾的函數被調用的時候,裝飾器的__call__()方法就會執行帶參數的裝飾器類
注意: 在裝飾階段,__init__ 函數執行,在被裝飾的方法被調用的時候,__call__ 執行
class Check(): def __init__(self, name): self.name = name def __call__(self, func): def wrapper(*args, **kwargs): return func(*args, **kwargs) return wrapper @Check("log") def login(uid): print(uid)
__call__()會在裝飾階段被調用帶參數裝飾器實現爬蟲超時處理
import time import requests RETRY_TIME = 3 DOWNLOAD_DELAY = 2 class Retry(object): def __init__(self,retries = 3,delay=0): self.retries = retries self.delay=delay def __call__(self,func): def wrapper(*args, **kwargs): for i in range(self.retries): try: result=func(*args,**kwargs) except Exception as e: print(e) time.sleep(self.delay) continue else: return result return wrapper @Retry(RETRY_TIME,DOWNLOAD_DELAY) def fetch(url): print(f"Start fetch {url}") resp = requests.get(url,timeout=5) print(resp.status_code) fetch("http://www.baidu.com")
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/42218.html
摘要:如果不使用裝飾器的話,普通的做法可能是在中寫一堆校驗代碼來判斷用戶是否登錄,然后決定后面的執行邏輯,這樣比較麻煩。 前言 裝飾器是程序開發中經常會用到的一個功能,也是python語言開發的基礎知識,如果能夠在程序中合理的使用裝飾器,不僅可以提高開發效率,而且可以讓寫的代碼看上去顯的高大上^_^ 使用場景 可以用到裝飾器的地方有很多,簡單的舉例如以下場景 引入日志 函數執行時間統計 執...
摘要:與字符串不同,列表元素支持改寫。元組比列表更加安全,因為不能修改集合一個功能是進行集合操作,另一個功能是消除重復的元素。 基本數據類型 數字 整型,浮點型,布爾型,復數 組 序列,集合,字典 1 組 # 序列-字符串 str 不可變類型 # 序列-列表 list [1,2,3,4,5,6,as] 可變類型 # 序列-元組 tuple (1,2,3,4,5,6,as) 不可變類型 ...
摘要:簡評將于今年夏天發布,中將會有許多新東西,最激動人心的新功能之一是裝飾器。因此,只需將代碼更改為以下代碼即可實現四種方法我們去掉了方法,以確保裝飾器可以添加它生成的對應方法。 簡評:Python 3.7 將于今年夏天發布,Python 3.7 中將會有許多新東西,最激動人心的新功能之一是 dataclass 裝飾器。 什么是 Data Class 大多數 Python 開發人員編寫過很...
摘要:實現一個簡單的裝飾器輸出被裝飾函數的運行時間簡單運用運行結果運行過程中,首先輸出裝飾器函數中的內容被裝飾函數運行時間長度函數名稱和實際參數計算結果然后得到最終的計算結果。 函數裝飾器 函數裝飾器用于在源碼中標記函數, 以某種方式增強函數的行為,這是一個強大的功能。 函數裝飾器是一個可調用對象,其參數是另外一個函數,即被裝飾函數。裝飾器可能處理被裝飾函數,然后將其返回,或者將其替換成另一...
摘要:函數裝飾器和閉包嚴格來說,裝飾器只是語法糖。何時執行裝飾器它們在被裝飾的函數定義之后立即運行。裝飾器突出了被裝飾的函數的作用,還便于臨時禁用某個促銷策略只需把裝飾器注釋掉。 函數裝飾器和閉包 嚴格來說,裝飾器只是語法糖。如前所示,裝飾器可以像常規的可調用對象那樣調用,其參數是另一個函數。有時,這樣做更方便,尤其是做元編程(在運行時改變程序的行為)時。 Python何時執行裝飾器 它們在...
閱讀 6866·2021-09-22 15:36
閱讀 5687·2021-09-02 10:20
閱讀 1869·2019-08-30 15:44
閱讀 2653·2019-08-29 14:06
閱讀 1155·2019-08-29 11:17
閱讀 1586·2019-08-26 14:05
閱讀 3093·2019-08-26 13:50
閱讀 1551·2019-08-26 10:26