網(wǎng)站首頁 編程語言 正文
一、前言
每當(dāng)做搜索任務(wù)或者時間復(fù)雜度任務(wù)相關(guān)時候,就會有統(tǒng)計函數(shù)被調(diào)用次數(shù)的需求。通常我們的做法是在函數(shù)前面定義一個變量,每循環(huán)調(diào)用一次,變量就加一,這不失為一種辦法,那么有沒有更高效的方法呢?
二、正文
第一種方法:
當(dāng)然有,那就是python的獨家專屬操作—> 裝飾器。
廢話不多說,直接上例子:
class CallingCounter(object):
? ? def __init__ (self, func):
? ? ? ? self.func = func
? ? ? ? self.count = 0
? ? def __call__ (self, *args, **kwargs):
? ? ? ? self.count += 1
? ? ? ? return self.func(*args, **kwargs)
@CallingCounter
def test():
? ? print('我被調(diào)用了')
test()
print(f'我被調(diào)用了{(lán)test.count}次')
如果是統(tǒng)計class中的函數(shù)被調(diào)用的次數(shù),就把 裝飾器 裝在被調(diào)用函數(shù)的前面即可。
class CallingCounter(object):
? ? def __init__ (self, func):
? ? ? ? self.func = func
? ? ? ? self.count = 0
? ? def __call__ (self, *args, **kwargs):
? ? ? ? self.count += 1
? ? ? ? return self.func(*args, **kwargs)
class Test:
? ? @CallingCounter
? ? def test():
? ? ? ? print('我被調(diào)用了')
for i in range(10):
? ? Test.test()
print(f'我被調(diào)用了{(lán)Test.test.count}次')
如果你的class中有很多的self用來調(diào)用函數(shù),那么可能會報錯,提示self無xxx屬性or函數(shù)。這時候就要看第二種方法
第二種方法:
def call_counter(func):
? ? def helper(*args, **kwargs):
? ? ? ? helper.calls += 1
? ? ? ? return func(*args, **kwargs)
? ? helper.calls = 0
? ? helper.__name__= func.__name__
? ? return helper
? ??
# 下面是使用裝飾器
@call_counter
def f():
? ? pass
print(f.calls)
for _ in range(10):
? ? f()
print(f.calls)
# 0 10
# 這里是另一種調(diào)用方式
def f():
? ? pass
f = call_counter(f)
print(f.calls)
for _ in range(10):
? ? f()
print(f.calls)
# 0 10
上面兩種方法筆者都親自做了測試,下面再介紹3個超簡單的(狗頭保命)
第3.1種方法(超簡單)
calls = 0
def f():
? ? global calls?
? ? calls ?+= 1
? ? # do your func stuff here
? ??
## 如果想統(tǒng)計class中的函數(shù)使用次數(shù),同理
第3.2種方法(超簡單)
class Test(object):
def __init__(self):
self.calls = 0
def f(self):
self.calls += 1
# do your func stuff here
第3.3種方法(超簡單)
class Test(object):
? ? calls = 0
? ? def __init__(self):
? ? ? ? pass
? ? def f(self):
? ? ? ? Test.calls += 1
? ? ? ? # do your func stuff here
# 調(diào)用方式
# Test().f()
A = Test()
for i in range(10):
? ? A.f()
print(A.calls)
print(Test().calls)
print(Test.calls)
三、小結(jié)
原文鏈接:https://blog.csdn.net/weixin_43804047/article/details/128909029
相關(guān)推薦
- 2024-03-24 go 連接redis集群
- 2022-02-10 easy LESS只針對特定工程啟用
- 2022-04-22 自定義注解+Spel實現(xiàn)分布式鎖
- 2022-03-13 .Net6開發(fā)winform程序使用依賴注入_C#教程
- 2023-08-01 v-model 和 .sync 深度解讀
- 2024-02-28 UNI-APP,設(shè)置某個頁面橫屏后,恢復(fù)豎屏,返回再次進(jìn)入其他頁面時,頁面內(nèi)容放大錯亂
- 2022-09-27 阿里云官方Redis開發(fā)規(guī)范總結(jié)_Redis
- 2023-03-27 Python中反轉(zhuǎn)二維數(shù)組的行和列問題_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支