python无参数装饰器_Python装饰器(不带参数)
示例
直接給出示例,普通裝飾器(即裝飾器函數本身不帶參數,或參數為實際被包裹的函數):
import time
from functools import wraps
def timethis(func):
'''
Decorator that reports the execution time.
'''
@wraps(func)
def wrapper(*args, **kwargs):
'''
New func
'''
start = time.time()
result = func(*args, **kwargs)
end = time.time()
print(func.__name__, end - start)
return result
return wrapper
@timethis
def countdown(n):
'''
Counts down
'''
while n > 0:
n -= 1
裝飾器函數接收一個被包裹函數作為參數,然后返回一個新函數作為返回值。
@timethis
def countdown(n):
pass
和下面的寫法一樣,故裝飾器@只是作為一種語法糖。
def countdown(n):
pass
countdown = timethis(countdown)
## 保留被包裝函數的元數據 ##
使用@wraps(func)可以保留原始函數的元數據,如下:
>>> countdown.__name__
'countdown'
>>> countdown.__doc__
'\n\tCounts down\n\t'
>>> countdown.__annotations__
{'n': }
若不使用@wraps(func),結果如下:
>>> countdown.__name__
'wrapper'
>>> countdown.__doc__
'\n\tNew func\n\t'
>>> countdown.__annotations__
{}
## 獲取被包裝器包裹的原始函數 ##
裝飾器已應用于函數,但想“撤消”它,以訪問原始的未包裝函數。可以按如下方式:
@somedecorator
def add(x, y):
return x + y
orig_add = add.__wrapped__
print(orig_add(3, 4)) # 7
只用再被包裹的函數上使用@wraps才能使用函數的__wrapped__屬性。
最后但同樣重要的一點是,請注意并非所有裝飾器都使用@wraps,因此它們可能無法按所述方式工作。 特別是,內置的裝飾器@staticmethod和@classmethod創建的描述符對象不遵循此約定(相反,它們將原始函數存儲在__func__屬性中)。
總結
以上是生活随笔為你收集整理的python无参数装饰器_Python装饰器(不带参数)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python冷知识_python冷知识
- 下一篇: 人脸识别三大经典算法_人脸识别系列四 |