中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python內置的wraps裝飾器的作用

發布時間:2020-08-26 17:26:44 來源:億速云 閱讀:334 作者:Leah 欄目:編程語言

Python內置的wraps裝飾器的作用?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

Python裝飾器(decorator)在實現的時候,被裝飾后的函數其實已經是另外一個函數了(函數名等函數屬性會發生改變),為了不影響,Python的functools包中提供了一個叫wraps的decorator來消除這樣的副作用。寫一個decorator的時候,最好在實現之前加上functools的wrap,它能保留原有函數的名稱和docstring。

wraps內置方法的作用

查看一個函數的幫助文檔有兩種方法:

func_name.__doc__
help(func_name)

先來看一個例子,定義timmer裝飾器和index函數,并且都添加了幫助文檔。

import time
def timmer(func):
    def inner(*args,**kwargs):
        'wrapper inner function'
        start_time=time.time()
        res=func(*args,**kwargs)
        end_time=time.time()
        print("run time: %s " %(end_time-start_time))
        return res
    return inner
def index():
    'index function'
    time.sleep(2)
    print("welcome to index page")

在index沒有被timmer裝飾前,來查看index的幫助文檔:

print(index.__doc__)

程序運行結果:

index function

然后為index添加timmer裝飾器,再次查看index函數的幫助文檔:

import time
def timmer(func):
    def inner(*args,**kwargs):
        'wrapper inner function'
        start_time=time.time()
        res=func(*args,**kwargs)
        end_time=time.time()
        print("run time: %s " %(end_time-start_time))
        return res
    return inner
@timmer
def index():
    'index function'
    time.sleep(2)
    print("welcome to index page")
print(index.__doc__)

程序運行結果:

wrapper inner function

可以看到,在為index函數添加裝飾器后,index函數的幫助文檔變成裝飾器timmer內部函數的幫助文檔了。

換句話說,就是原始index函數內部的數據被裝飾器timmer修改了。

怎么樣才能在保留原始被裝飾函數的數據的前提下,為函數添加新功能呢??就是python內置的wraps裝飾器。

導入wraps裝飾器,修改上面的代碼,為timmer的內部函數添加wraps裝飾器,然后再次查看被裝飾函數的幫助文檔:

import time
from functools import wraps
def timmer(func):
    @wraps(func)
    def inner(*args,**kwargs):
        'wrapper inner function'
        start_time=time.time()
        res=func(*args,**kwargs)
        end_time=time.time()
        print("run time: %s " %(end_time-start_time))
        return res
    return inner
@timmer
def index():
    'index function'
    time.sleep(2)
    print("welcome to index page")
print(index.__doc__)

運行程序,執行結果如下:

index function

可以看到,index函數即使添加了裝飾器,其內部的原始數據仍然沒有被裝飾器修改。

從上面的示例可以看出,wraps裝飾器的作用就是保留被裝飾對象的原始數據信息。

實例一:

不加wraps

# -*- coding=utf-8 -*- 
from functools import wraps   
def my_decorator(func):
    def wrapper(*args, **kwargs):
        '''decorator'''
        print('Calling decorated function...')
        return func(*args, **kwargs)
    return wrapper  
 
@my_decorator 
def example():
    """Docstring""" 
    print('Called example function')
print(example.__name__, example.__doc__)

執行結果:

('wrapper', 'decorator')

實例二:

加wraps

# -*- coding=utf-8 -*- 
from functools import wraps   
def my_decorator(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        '''decorator'''
        print('Calling decorated function...')
        return func(*args, **kwargs)
    return wrapper  
 
@my_decorator 
def example():
    """Docstring""" 
    print('Called example function')
print(example.__name__, example.__doc__)

執行結果:

('example', 'Docstring')

總結:

warps 作用: 消除(被裝飾后的函數名等屬性的改變)副作用。

關于Python內置的wraps裝飾器的作用問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

营山县| 威远县| 潞城市| 湖南省| 汝阳县| 武安市| 土默特左旗| 平果县| 铜陵市| 安顺市| 四子王旗| 都匀市| 双城市| 中江县| 孝义市| 资中县| 阿拉尔市| 民权县| 陇南市| 青海省| 藁城市| 迁安市| 黔南| 怀仁县| 务川| 理塘县| 内黄县| 华宁县| 莱芜市| 北辰区| 琼海市| 饶阳县| 凉山| 安化县| 本溪市| 石阡县| 沁阳市| 玉门市| 宁阳县| 吴旗县| 九江市|