Python裝飾器(2)name和doc

內(nèi)容純屬個(gè)人理解,不對(duì)之處,歡迎指點(diǎn)。

裝飾問題:__name__和__doc__

接著上回分解,在我們給函數(shù)添加了計(jì)算運(yùn)行時(shí)間的功能后(準(zhǔn)確來說應(yīng)該是執(zhí)行某函數(shù)時(shí)我們同時(shí)對(duì)函數(shù)做了一些操作,畢竟一個(gè)函數(shù)的存在就是為了完成某一個(gè)具體的功能,而不是多個(gè)),其實(shí)裝飾器也對(duì)函數(shù)做了一些其他的修改。
示例:

def deco(func):
    '''i am deco'''
    def wrap(*args, **kwargs):
        '''i am wrap'''
        return func(*args, **kwargs)
    return wrap


@deco
def foo():
    '''i am foo'''
    print("---foo---")

當(dāng)我們執(zhí)行foo():

>> foo()
---foo---

此時(shí)似乎還沒有問題,但是當(dāng)我們查看函數(shù)文檔和函數(shù)名字時(shí):

>> foo.__doc__
'i am wrap'
>> foo.__name__
'wrap'

此時(shí)問題就來了,函數(shù)的信息被修改了,然而這并不是我們想要的結(jié)果,究其原因,還是裝飾器裝飾過程中的問題。
我們來看一下裝飾器的裝飾過程:

1. wrap = deco(foo)  # 將foo函數(shù)傳入deco函數(shù),并返回內(nèi)部的wrap函數(shù)
2. foo = wrap  # 將wrap函數(shù)賦給foo
3. foo()  # 執(zhí)行foo函數(shù)

由上可以看到,此時(shí)的foo已經(jīng)不是原來的foo了,確切的說,它已經(jīng)變成了wrap,是wrap賦值給了foo,所以才有了執(zhí)行foo時(shí)可以執(zhí)行添加的功能,也就是執(zhí)行了wrap。所以當(dāng)我們查看foo函數(shù)的docstring和name時(shí),顯示的是wrap函數(shù)的docstring和name。

問題總有解決的辦法。

from functools import wraps


def deco(func):
    '''i am deco'''

    @wraps(func)
    def wrap(*args, **kwargs):
        '''i am wrap'''
        return func(*args, **kwargs)
    return wrap


@deco
def foo():
    '''i am foo'''

    print("---foo---")

此時(shí)再運(yùn)行:

>> foo()
---foo---
>> foo.__name__
foo
>> foo.__doc__
i am foo

functools中的wraps可以保留原函數(shù)的__name__和__doc__,不使其發(fā)生改變,這樣才是更好的裝飾。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 包(lib)、模塊(module) 在Python中,存在包和模塊兩個(gè)常見概念。 模塊:編寫Python代碼的py...
    清清子衿木子水心閱讀 3,912評(píng)論 0 27
  • 每個(gè)人都有的內(nèi)褲主要功能是用來遮羞,但是到了冬天它沒法為我們防風(fēng)御寒,咋辦?我們想到的一個(gè)辦法就是把內(nèi)褲改造一下,...
    chen_000閱讀 1,403評(píng)論 0 3
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,569評(píng)論 19 139
  • 《老子上的優(yōu)雅課》 不要你齊家治國(guó)平天下 只要你從中學(xué)會(huì)好好享受生活 做一個(gè)取悅自己的溫柔小女子 前言: 《道德經(jīng)...
    再顧閱讀 452評(píng)論 0 0
  • 寫了一大堆后來實(shí)在搞不懂這個(gè)格式怎么調(diào)..利用謂詞查找本地?cái)?shù)據(jù)的demo
    馬鈴薯蜀黍閱讀 261評(píng)論 9 0

友情鏈接更多精彩內(nèi)容