前面一篇對python裝飾器有了初步的了解了,但是還不夠完美,領導看了後又提出了新的需求,希望執行的日誌能顯示出具體執行的哪個函式。
__name__
用於獲取函式的名稱,__doc__
用於獲取函式的docstring內容(函式的注釋)
import time
def func_a(a):
'''func_a --> hello'''
print("hello"+a)
time.sleep(0.5)
return true
def func_b(b, c="xx"):
'''func_b --> world'''
print("world"+b+c)
time.sleep(0.8)
return true
if __name__ == '__main__':
print(func_a.__name__) # 結果 func_a
print(func_a.__doc__) # func_a --> hello
print(func_b.__name__) # func_b
print(func_b.__doc__) # func_b --> world
在裝飾器裡面新增2行**,列印正在執行函式的名稱和docstring內容
import time
def runtime(func):
'''runtime decorators'''
print("running function : %s" % func.__name__)
print("docstring: %s" % func.__doc__)
start = time.time()
f = func(*args, **kwargs) # 原函式
end = time.time()
print("執行時長:%.4f 秒" % (end-start))
return f
@runtime
def func_a(a):
'''func_a --> hello'''
print("hello"+a)
time.sleep(0.5)
return true
@runtime
def func_b(b, c="xx"):
'''func_b --> world'''
print("world"+b+c)
time.sleep(0.8)
return true
if __name__ == '__main__':
func_a("a")
print(func_a.__name__)
print(func_a.__doc__)
執行結果
running function : func_a
docstring: func_a --> hello
helloa
執行時長:0.5008 秒
import time
from functools import wraps
def runtime(func):
'''runtime decorators'''
@wraps(func)
print("running function : %s" % func.__name__)
print("docstring: %s" % func.__doc__)
start = time.time()
f = func(*args, **kwargs) # 原函式
end = time.time()
print("執行時長:%.4f 秒" % (end-start))
return f
執行結果
running function : func_a
docstring: func_a --> hello
helloa
執行時長:0.5004 秒
func_a
func_a --> hello
帶引數的裝飾器,可以寫成類裝飾器
import time
from functools import wraps
class runtime(object):
'''runtime class decorators'''
def __init__(self, slowly=1):
self.slowly = slowly
def __call__(self, func):
@wraps(func)
print("running function : %s" % func.__name__)
print("docstring: %s" % func.__doc__)
start = time.time()
f = func(*args, **kwargs) # 原函式
end = time.time()
t = end-start
time.sleep((self.slowly-1)*t) # 延遲效果
new_end = time.time()
print("執行時長:%.4f 秒" % (new_end-start))
return f
@runtime(1.5)
def func_a(a):
'''func_a --> hello'''
print("hello"+a)
time.sleep(0.5)
return true
@runtime()
def func_b(b, c="xx"):
'''func_b --> world'''
print("world"+b+c)
time.sleep(0.8)
return true
if __name__ == '__main__':
func_a("a")
print(func_a.__name__)
print(func_a.__doc__)
執行結果
running function : func_a
docstring: func_a --> hello
helloa
執行時長:0.7522 秒
func_a
func_a --> hello
python自動化交流 qq群:779429633 Python之裝飾器筆記
概述 用於管理和增強函式和類行為的 提供一種在函式或類定義中插入自動執行 的機制 特點 更明確的語法 更高的 可維護性 更好的一致性 編寫函式基礎 將函式賦給變數 將函式作為引數傳遞 函式巢狀及跨域訪問 函式定義裝飾器 通用性更好 1 函式定義裝飾器 2 通用性更好34 引數化裝飾器 5def ta...
Python之裝飾器學習筆記
裝飾器本質上是乙個python函式,其返回值也是乙個函式物件 作用 不修改原函式情況下,為已有函式新增新的功能。如插入日誌 效能測試 事務處理 快取 許可權校驗等場景。閉包函式 在函式內部定義乙個內嵌函式,內嵌函式引用了外部函式的變數,此時內嵌函式稱為閉包函式。閉包函式所引用的外部定義的變數被叫做自...
python學習筆記之裝飾器
def print msg print msg是外函式 msg i m 狂師 defprinter printer是巢狀函式 print msg return printer 返回巢狀函式printerdef func a,b def line n nonlocal a nonlocal用於宣告變數...