python筆記36 裝飾器之wraps

2022-06-13 11:00:11 字數 3367 閱讀 3414

前面一篇對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用於宣告變數...