普通裝飾器(不帶引數)

2021-10-04 00:21:52 字數 1411 閱讀 3713

直接給出示例,普通裝飾器(即裝飾器函式本身不帶引數,或引數為實際被包裹的函式):

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...