直接給出示例,普通裝飾器(即裝飾器函式本身不帶引數,或引數為實際被包裹的函式):
import time
from functools import wraps
def timethis(func):
'''decorator that reports the execution time.
'''@wraps(func)
'''new func
'''start = time.time()
result = func(*args, **kwargs)
end = time.time()
print(func.__name__, end - start)
return result
@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__
若不使用@wraps(func),結果如下:
>>> countdown.__name__
>>> countdown.__doc__
'\n\tnew func\n\t'
>>> countdown.__annotations__
{}
裝飾器已應用於函式,但想「撤消」它,以訪問原始的未包裝函式。可以按如下方式:
@somedecorator
def add(x, y):
return x + y
print(orig_add(3, 4)) # 7
最後但同樣重要的一點是,請注意並非所有裝飾器都使用@wraps,因此它們可能無法按所述方式工作。 特別是,內建的裝飾器@staticmethod和@classmethod建立的描述符物件不遵循此約定(相反,它們將原始函式儲存在__func__屬性中)。 裝飾器三 裝飾器不帶引數
非固定引數接收傳入的實參,不論是多少都會接收。args,kwargs user status false def login func func是要傳入的函式的記憶體位址 def inner args,kwargs user alex password 123 global user status ...
引數,裝飾器
引數 若函式中所實現的需求涉及到一些未知項參與運算 這些未知項需要函式的呼叫者來決定 此時,可以將未知項設定為引數.位置引數 必備引數 傳遞引數的順序與定義的順序有關,必須按照定義的順序來進行傳遞.傳遞引數的個數與引數的個數必須保持一致.關鍵字引數 指函式呼叫的時候,可以通過 鍵 值 的形式來加以指...
裝飾器帶引數
裝飾器帶引數 帶引數的裝飾器是三層的 最外層的函式負責接受裝飾器引數 裡面的內容還是源裝飾器的內容 def outer a 第一層 負責接受引數的 defdecorate func 第二層 負責接受函式的 def wargs,kwargs 第三層 負責接受函式的引數 func wargs print...