日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python无参数装饰器_Python装饰器(不带参数)

發布時間:2024/1/23 python 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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装饰器(不带参数)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。