python裝飾器案例

2021-09-13 11:30:33 字數 3571 閱讀 3112

計算函式的執行時間

import requests

import time

import re

# 黑名單

def filter_url(url): # 過濾url

# 測試網路請求的響應時間

def check_runtime(func):

print('--初始裝飾--', func.__name__)

# 判斷url的 / path路徑是否存在,如果不存在,則追加/

if url[7:].find('/') == -1 or url[8:].find('/') == -1:

url += '/'

if filter_url(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

@check_runtime

def request(url):

print('--開始請求--', url)

resp = requests.get(url)

print('--響應--', resp.status_code)

print(resp.content)

print('---完成請求---')

request('')

帶引數裝飾器

設定許可權(表) 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)

print('--初始化裝飾函式--')

# 檢查當前使用者的許可權

permission_value = get_permission(permission)

# print(permission_value)

if current_rights & permission_value != permission_value:

print('當前使用者沒有許可權')

return

result = func(*args, **kwargs)

return result

@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):

return func(*args, **kwargs)

@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):

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

@retry(retry_time,download_delay)

def fetch(url):

print(f'start fetch ')

resp = requests.get(url,timeout=5)

print(resp.status_code)

fetch('')

Python裝飾器及相關案例

裝飾器本質上是乙個函式,該函式用來處理其他函式,它可以讓其他函式在不需要修改 的 前提下增加額外的功能,裝飾器的返回值也是乙個函式物件。它經常用於有切面需求的場景,比如 插入日誌 效能測試 事務處理 快取 許可權校驗等應用場景。為什麼需要裝飾器?寫 要遵循 開放封閉 原則,雖然在這個原則是用的物件導...

Python裝飾器原理分析和案例

裝飾器部分 裝飾器是可呼叫的物件,其引數是另乙個函式 被裝飾的函式 裝飾器可能會處理被裝飾的函式,將它返回 或者將其替換成另乙個函式或者可呼叫的物件。decorate def target print running target 以上例子,通過裝飾器之後,實際執行的是如下方法 def target...

Python案例實操 函式裝飾器

help classmethod help on class classmethod in module builtins class classmethod object classmethod function method convert a function to be a class me...