網站首頁 編程語言 正文
Python裝飾器用法
Python的裝飾器是個好東西,它能干很多事情。
但對于新手,它看起來似乎沒那么簡單。
但事實上,裝飾器本身也只是個函數。
import time
def log(func):
? ? def wrapper(*args, **kwargs):
? ? ? ? start = time.time()
? ? ? ? result = func(*args, **kwargs)
? ? ? ? end = time.time()
? ? ? ? print("The func '{}' used {}s.".format(func.__name__, end-start))
? ? ? ? return result
? ? return warpper
這一個裝飾器,當我們這樣使用時
@log
def fucok(name):
? ? """Fucok someone"""
? ? print("Fucok", name)
它只是執行了fucok = log(fucok)這樣一句代碼而已。
也就是說,我們表面上是用fucok("myself"),事實上執行的都是log(fucok)("myself")。因為Python里面都是對象嘛。
同樣的道理,假設我們定義了一個帶參數的裝飾器logging,它實際上執行的是
func = logging(arguments)(func)
也就是上面那個不帶參數的裝飾器多定義一層就行了。
import time
def logging(arguments):
? ? def log(func):
? ? ? ? def warpper(*args, **kwargs):
? ? ? ? ? ? start = time.time()
? ? ? ? ? ? result = func(*args, **kwargs)
? ? ? ? ? ? end = time.time()
? ? ? ? ? ? print("The func '{}' used {}s.".format(func.__name__, end-start))
? ? ? ? ? ? return result
? ? ? ? return warpper
? ? # do something
? ? return log
但,當我們使用一個裝飾器之后,它會將原本的函數元信息給覆蓋掉。譬如:函數名稱,函數文檔等等。
例如上例
print(fucok.__name__)
print(fucok.__doc__)
你會發現,函數信息全部沒了!fucok它不叫fucok,改名叫wrapper了。它的文檔也變成了none。
解決辦法很簡單,定義裝飾器的時候用warps裝飾器裝飾接受原函數參數的那一層就行了。
這個來自functools模塊的裝飾器能幫你復制函數的元信息到被綁定的函數身上。
修改裝飾器如下(其實就加了一行代碼hhh)
import time
from functools import wraps
def log(func):
? ? @wraps(func)
? ? def warpper(*args, **kwargs):
? ? ? ? start = time.time()
? ? ? ? result = func(*args, **kwargs)
? ? ? ? end = time.time()
? ? ? ? print("The func '{}' used {}s.".format(func.__name__, end-start))
? ? ? ? return result
? ? return warpper
當我們再運行
print(fucok.__name__)
print(fucok.__doc__)
就能看到函數的的元信息沒變了。
裝飾器定義時加@wraps是個好習慣。
一個較為實用的裝飾器demo在該專題的另一篇文章:函數參數類型檢查
總結
原文鏈接:https://www.jianshu.com/p/4416e291c64d
相關推薦
- 2023-02-06 C語言預處理器使用方法講解_C 語言
- 2022-05-10 C++構造函數+復制構造函數+重載等號運算符調用_C 語言
- 2023-05-03 Pycharm?Terminal?與Project?interpreter?安裝包不同步問題解決_p
- 2022-12-24 ReactNative支付密碼輸入框實現詳解_React
- 2023-02-09 C++開發protobuf動態解析工具_C 語言
- 2023-11-20 【ROS】用roslibpy庫在windows上用python 連接Ubuntu ROS
- 2024-03-05 git的使用
- 2023-05-30 Pandas.DataFrame行和列的轉置的實現_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支