網(wǎng)站首頁 編程語言 正文
裝飾器通用模型
def wrapper(fn): def inner(*args, **kwargs): ret = fn(*args, **kwargs) return ret return inner
裝飾器幾個關鍵點
""" 1.函數(shù)可以當參數(shù)傳遞 2.函數(shù)可以作為返回值進行返回 3.函數(shù)名稱可以當成變量一樣進行賦值操作 裝飾器本質上是個閉包 在不改變原有函數(shù)調用的情況下,給函數(shù)增加新的功能 """
舉個例子
#!/usr/bin/python def admin(game): def inner(*args, **kwargs): # inner添加了參數(shù),args 一定是個元組 kwargs 一定是字典 print('打開Wg') result = game(*args, **kwargs) # * ** 表示把args元組和kwargs打散成位置參數(shù),關鍵字參數(shù)傳遞進去 print('關閉Wg') return result return inner @admin def play_dnf(username, password): print(f'開始玩DNF,賬號:{username},密碼:{password}') print('刀斬肉身,心斬靈魂') return '掉落:戮蠱的哀鳴炮' @admin def play_wow(race, occupation, server_name, camp): print(f'開始玩魔獸世界,種族:{race},職業(yè):{occupation},服務器:{server_name},陣營:{camp}') print('為了辛多雷的榮耀') return '掉落:灰燼使者' if __name__ == '__main__': ret1 = play_dnf('大馬猴', '888888') print(ret1) ret2 = play_wow('血精靈', '圣騎士', '回音山', '部落') print(ret2)
這代碼還是很好懂的,我就不解釋了,然后是執(zhí)行結果
python demo.py 打開Wg 開始玩DNF,賬號:大馬猴,密碼:888888 刀斬肉身,心斬靈魂 關閉Wg 掉落:戮蠱的哀鳴炮 打開Wg 開始玩魔獸世界,種族:血精靈,職業(yè):圣騎士,服務器:回音山,陣營:部落 為了辛多雷的榮耀 關閉Wg 掉落:灰燼使者 Process finished with exit code 0
一個函數(shù)被多個裝飾器裝飾,又將如何執(zhí)行呢?
#!/usr/bin/python def wrapper1(fn): def inner(*args, **kwargs): print('這是w1進入') ret = fn(*args, **kwargs) print('這是w1出去') return ret return inner def wrapper2(fn): def inner(*args, **kwargs): print('這是w2進入') ret = fn(*args, **kwargs) print('這是w2出去') return ret return inner @wrapper1 @wrapper2 def target(): print('我是目標') if __name__ == '__main__': target()
直接給出執(zhí)行順序
一個函數(shù)被多個裝飾器裝飾的執(zhí)行順序
# w1 w2 target w2 w1
帶參數(shù)的裝飾器
裝飾器的語法允許我們在調用時,提供其它參數(shù),比如@decorator(a)。這樣,就為裝飾器的編寫和使用提供了更大的靈活性。
(在上面又套了一層函數(shù))
比如,我們可以在裝飾器中指定日志的等級,因為不同業(yè)務函數(shù)可能需要的日志級別是不一樣的。
def use_logging(level): def decorator(func): def wrapper(*args, **kwargs): if level == "warn": logging.warn("%s is running" % func.__name__) elif level == "info": logging.info("%s is running" % func.__name__) return func(*args) return wrapper return decorator @use_logging(level="warn") def foo(name='foo'): print("i am %s" % name) foo()
類裝飾器
沒錯,裝飾器不僅可以是函數(shù),還可以是類,相比函數(shù)裝飾器,類裝飾器具有靈活度大、高內(nèi)聚、封裝性等優(yōu)點。使用類裝飾器主要依靠類的__call__方法,當使用 @ 形式將裝飾器附加到函數(shù)上時,就會調用此方法。
class Foo(object): def __init__(self, func): self._func = func def __call__(self): print ('class decorator runing') self._func() print ('class decorator ending') @Foo def bar(): print ('bar') bar()
總結
原文鏈接:https://blog.csdn.net/hans99812345/article/details/123673788
相關推薦
- 2023-07-24 利用keyup事件實現(xiàn)input框輸入0-1之間的數(shù)字且最多只能保留2位小數(shù)
- 2022-03-30 Android實現(xiàn)靜音檢測功能_Android
- 2022-01-08 React項目創(chuàng)建報錯解決方案npm ERR! code 1 npm ERR! path E:\No
- 2022-06-18 android自定義滾動上下回彈scollView_Android
- 2022-08-18 python上下文管理器使用場景及異常處理_python
- 2022-11-28 Android線程間通信Handler源碼詳解_Android
- 2023-07-24 vxe-grid實現(xiàn) 二維數(shù)據(jù)聯(lián)動
- 2022-03-17 C++游戲編程之模擬實現(xiàn)鍵盤打字程序_C 語言
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結構-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支