日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python装饰器应用论文_Python装饰器的应用场景代码总结

發布時間:2024/7/23 python 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python装饰器应用论文_Python装饰器的应用场景代码总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

裝飾器的應用場景 附加功能 數據的清理或添加: 函數參數類型驗證 @require_ints 類似請求前攔截 數據格式轉換 將函數返回字典改為 json/YAML 類似響應后篡改 為函數提供額外的數據 mock.patch 函數注冊 在任務中心注冊一個任務 注冊一個帶信號處理器的函數

不同應用場景下裝飾器實現

簡單注冊表 funcs = []

def register(func):

funcs.append(func)

return func

@register

def a():

return 3

@register

def b():

return 5

# 訪問結果

result = [func() for func in funcs]

注冊表隔離(使用類的不同實例) class Registry(object):

def __init__(self):

self._funcs = []

def register(self, func):

self._funcs.append(func)

def run_all(self):

return [func() for func in self._funcs]

r1 = Registry()

r2 = Registry()

@r1.register

def a():

return 3

@r2.register

def b():

return 5

@r1.register

@r2.register

執行時封裝代碼

類型檢查 from functools import wraps

def require_ints(func):

@wraps(func) # 將func的信息復制給inner

def inner(*args, **kwargs):

for arg list(args) + list(kwargs.values()):

if not isinstance(arg, int:

raise TypeError("{} 只接受int類型參數".format(func.__name__)

return func(*args, **kwargs)

return inner

用戶驗證 from functools import wraps

class User(object):

def __init__(self, username, email):

self.username = username

self.email = email

class AnonymousUser(object):

def __init__(self):

self.username = self.email = None

def __nonzero__(self): # 將對象轉換為bool類型時調用

return False

def requires_user(func):

@wraps(func)

def inner(user, *args, **kwargs): # 由于第一個參數無法支持self, 該裝飾器不支持裝飾類

if user and isinstance(user, User):

return func(use, *args, **kwargs)

else:

raise ValueError("非合法用戶")

return inner

輸出格式化 import json

from functools import wraps

def json_output(func): # 將原本func返回的字典格式轉為返回json字符串格式

@wrap(func)

def inner(*args, **kwargs):

return json.dumps(func(*args, **kwargs))

return inner

異常捕獲 import json

from functools import wraps

class Error1(Exception):

def __init__(self, msg):

self.msg = msg

def __str__(self):

return self.msg

def json_output(func):

@wrap(func)

def inner(*args, **kwargs):

try:

result = func(*args, **kwargs)

except Error1 as ex:

result = {"status": "error", "msg": str(ex)}

return json.dumps(result)

return inner

# 使用方法

@json_ouput

def error():

raise Error1("該條異常會被捕獲并按JSON格式輸出")

日志管理 import time

import logging

from functools import wraps

def logged(func):

@wraps(func)

def inner(*args, **kwargs): # *args可以裝飾函數也可以裝飾類

start = time.time()

result = func(*args, **kwargs)

exec_time = time.time() - start

logger = logging.getLoger("func.logged")

logger.warning("{} 調用時間:{:.2} 執行時間:{:.2}s 結果:{}".format(func.__name__, start, exec_time, result)

帶參數的裝飾器

帶參數的裝飾器相當于一個返回裝飾器的函數,@deco(a=1)在調用@之前會首先執行deco(a=1)得到一個實際的裝飾器, 帶參數的裝飾器deco(a=1)模塊導入時立即執行

裝飾類

為類增加可排序功能(而不通過繼承子類擴充父類方法,比如多個類需要增加此功能時) import time

from functools import wraps

def sortable_by_created(cls):

original_init = cls.__init__

@wrap(original_init)

def new_init(self, *args, **kwargs):

original_init(*args, **kwargs)

self._created = time.time()

cls.__init__ = new_init

cls.__lt__ = lambda self, other: self._created < other._created

cls.__gt__ = lambda self, other: self._created > other._created

return cls

也可定義一個SortableByCreated()類, 子類使用多重繼承其父類和SortableByCreated

類型轉換

函數被裝飾后有可能變為一個類的實例,此時為了兼容函數調用,應為所返回的類提供__call__方法 class Task(object):

def __call__(self, *args, **kwargs):

return self.run(*args, **kwargs)

def run(self, *args, **kwargs):

raise NotImplementedError("子類未實現該接口")

def task(func):

class SubTask(Task):

def run(self, *args, **kwargs):

func(*args, **kwargs)

return SubTask()

第二章 上下文管理器

定義

包裝任意代碼

確保執行的一致性

語法

with語句

__enter__和__exit__方法 class ContextManager(object):

def __init__(self):

self.entered = False

def __enter__(self):

self.entered = True

return self

def __exit__(self, exc_type, exc_instance, traceback):

self.entered = False

應用場景

資源清理 import pymysql

class DBConnection(object):

def __init__(self, *args, **kwargs):

self.args,self.kwargs = args, kwargs

def __enter__(self):

self.conn = pymysql.connect(*args, **kwargs)

return self.conn.cursor()

def __exit__(self, exc_type, exc_instance, trackback):

self.conn.close()

異常處理(避免重復)

傳播異常(__exit__中return False)

終止異常(__exit__中return True) class BubleExceptions(object):

def __enter__(self):

return self

def __exit__(self, exc_type, exc_instance, trackback):

if exc_instance:

print("出現異常: {}".format(exc_instance)

return False # return True終止異常

處理特定的異常 class HandleValueError(object):

def __enter__(self):

return self

def __exit__(self, exc_type, exc_instance, trackback):

if not exc_type: return True

if issubclass(exc_type, ValueError):

print("處理ValueError: {}".format(exc_instance)

return False

if issubclass...語句改為if exec_type == ValueError則不處理ValueType的子類異常

也可以根據異常的屬性來判斷是否傳播或終止

更簡單的語法 import contextlib

@contextlib.contextmanager

def acceptable_error_codes(*codes):

try:

yield

except ShellException as exc_instance:

if exc_instance.code not in codes:

raise

pass

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持聚米學院。

總結

以上是生活随笔為你收集整理的python装饰器应用论文_Python装饰器的应用场景代码总结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。