国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

python裝飾器案例

張利勇 / 3361人閱讀

摘要:普通裝飾器函數計算函數的運行時間黑名單過濾測試網絡請求的響應時間初始裝飾閉包函數判斷的路徑是否存在,如果不存在,則追加已取消下載此已在黑名單中獲取開始請求的時間執行時間返回一個包裝函數包裝被裝飾函數的參數列表開始

普通裝飾器函數

計算函數的運行時間

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 多個裝飾的調用順序

    摘要:如果不使用裝飾器的話,普通的做法可能是在中寫一堆校驗代碼來判斷用戶是否登錄,然后決定后面的執行邏輯,這樣比較麻煩。 前言 裝飾器是程序開發中經常會用到的一個功能,也是python語言開發的基礎知識,如果能夠在程序中合理的使用裝飾器,不僅可以提高開發效率,而且可以讓寫的代碼看上去顯的高大上^_^ 使用場景 可以用到裝飾器的地方有很多,簡單的舉例如以下場景 引入日志 函數執行時間統計 執...

    wapeyang 評論0 收藏0
  • python:基礎知識

    摘要:與字符串不同,列表元素支持改寫。元組比列表更加安全,因為不能修改集合一個功能是進行集合操作,另一個功能是消除重復的元素。 基本數據類型 數字 整型,浮點型,布爾型,復數 組 序列,集合,字典 1 組 # 序列-字符串 str 不可變類型 # 序列-列表 list [1,2,3,4,5,6,as] 可變類型 # 序列-元組 tuple (1,2,3,4,5,6,as) 不可變類型 ...

    xiongzenghui 評論0 收藏0
  • Python 3.7 將引入 dataclass 裝飾

    摘要:簡評將于今年夏天發布,中將會有許多新東西,最激動人心的新功能之一是裝飾器。因此,只需將代碼更改為以下代碼即可實現四種方法我們去掉了方法,以確保裝飾器可以添加它生成的對應方法。 簡評:Python 3.7 將于今年夏天發布,Python 3.7 中將會有許多新東西,最激動人心的新功能之一是 dataclass 裝飾器。 什么是 Data Class 大多數 Python 開發人員編寫過很...

    leanote 評論0 收藏0
  • python學習筆記 函數裝飾

    摘要:實現一個簡單的裝飾器輸出被裝飾函數的運行時間簡單運用運行結果運行過程中,首先輸出裝飾器函數中的內容被裝飾函數運行時間長度函數名稱和實際參數計算結果然后得到最終的計算結果。 函數裝飾器 函數裝飾器用于在源碼中標記函數, 以某種方式增強函數的行為,這是一個強大的功能。 函數裝飾器是一個可調用對象,其參數是另外一個函數,即被裝飾函數。裝飾器可能處理被裝飾函數,然后將其返回,或者將其替換成另一...

    jsliang 評論0 收藏0
  • 流暢的python讀書筆記-第七章-函數裝飾和閉包

    摘要:函數裝飾器和閉包嚴格來說,裝飾器只是語法糖。何時執行裝飾器它們在被裝飾的函數定義之后立即運行。裝飾器突出了被裝飾的函數的作用,還便于臨時禁用某個促銷策略只需把裝飾器注釋掉。 函數裝飾器和閉包 嚴格來說,裝飾器只是語法糖。如前所示,裝飾器可以像常規的可調用對象那樣調用,其參數是另一個函數。有時,這樣做更方便,尤其是做元編程(在運行時改變程序的行為)時。 Python何時執行裝飾器 它們在...

    Hydrogen 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<