網站首頁 編程語言 正文
個人理解
裝飾器: 通過閉包和將一個函數作為另一個函數參數的形式,實現已有功能的靈活調用
例如:
首先設置了一個time_master的計時器函數,在運行某個函數的同時,用來統計函數的耗時
那么,如果想知道函數性能, 每次寫完新的函數后,都放到time_master函數中運行一次來統計。
——> 這是比較麻煩的。相當于雖然有了一個稱,但是所有的新買食材都需要逐個放到稱上去稱一遍,來獲得食材的重量
——> 如果能夠省略掉一次一次上稱這個步驟就好了
——> 比如每個食材進門的同時就從稱上走過,那進來的同時,也就有了重量的數據
例子:調用函數的同時對函數進行計時
實現方法1:@語法糖
代碼:
# 涉及到計時,需要引入time模塊 import time # 定義一個對函數運行耗時統計的計時器,用func作為形參來代替需要統計的函數 def time_master(func): def call_func(): print("計時器開始:函數開始調用:") start_time = time.time() func() end_time = time.time() print('計時器結束,函數調用完成') return print(f'計時器結果返回:函數調用耗時{end_time-start_time:.2f}') return call_func @time_master # 即在調用myfunc函數時,不是直接調用myfunc # 而是將myfunc函數作為一個參數放入到@的裝飾器中,然后去調用裝飾器 def myfunc(): time.sleep(2) print('myfunc函數運行') time.sleep(4) print('myfunc函數運行結束') myfunc() # 調用myfunc
實現結果:
計時器開始:函數開始調用:
myfunc函數運行
myfunc函數運行結束
計時器結束,函數調用完成
計時器結果返回:函數調用耗時6.01
實現方法2:閉包
可以理解成,本來定義了一個myfunc的函數,但這個函數本身沒有計時的功能,而恰巧有一個time_master的函數,在運行子函數的同時,還會對子函數進行計時
因此,通過重新定義 myfunc = time_master(myfunc)
, 即將myfunc作為參數傳入到time_master中,作為myfunc函數的新定義
代碼:
import time def time_master(func): def call_func(): print("計時器開始:函數開始調用:") start_time = time.time() func() end_time = time.time() print('計時器結束,函數調用完成') print(f'計時器結果返回:函數調用耗時{end_time-start_time:.2f}') return call_func def myfunc(): time.sleep(2) print('myfunc函數運行') time.sleep(4) print('myfunc函數運行結束') myfunc = time_master(myfunc) # 和實現方法一的差距就在于是在myfunc前面@裝飾器,還是在后面對myfunc函數進行二次定義 myfunc()
實現結果:
計時器開始:函數開始調用:
myfunc函數運行
myfunc函數運行結束
計時器結束,函數調用完成
計時器結果返回:函數調用耗時6.01
實現方式1和 2的差異
實現方式1和實現方式2: 其實沒什么區別,無非是一開始就用@time_master
來規定,還是定義完myfunc
之后,再多做一步讓myfun放入time_master
中去執行
總結
原文鏈接:https://blog.csdn.net/Erutree/article/details/122903278
相關推薦
- 2022-04-09 windows中查看進程(netstat)和殺掉進程(taskkill)的幾個命令
- 2022-03-27 Android自定義模擬時鐘控件_Android
- 2022-10-13 Python?變量教程之打包和解包參數_python
- 2022-11-29 redis命令行操作庫、鍵、和五大數據類型詳解
- 2023-07-22 JVM的類加載機制和垃圾回收機制
- 2022-09-12 IOS開發自定義view方法規范示例_IOS
- 2022-08-23 C++?primer超詳細講解泛型算法_C 語言
- 2022-03-26 聊聊virtualbox6安裝centos增強功能問題_VirtualBox
- 最近更新
-
- 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同步修改后的遠程分支