python wraps(裝飾器)用法


在我們使用了裝飾器函數之后,我們的被裝飾函數默認指向了裝飾器的名字(內存地址)

如:

def wrapper(func):  # func = holiday
    def inner(*args, **kwargs):
        print('在被裝飾的函數執行之前做的事')
        ret = func(*args, **kwargs)
        print('在被裝飾的函數執行之后做的事')
        return ret
    return inner

@wrapper   #holiday = wrapper(holiday)
def holiday(day):
    ''' 這是一個放假通知 '''
    print('全體放假%s天'%day)
    return '好開心'

print(holiday.__name__)
print(holiday.__doc__)

該實例運行結果為: inner
          我是inner函數的注釋

  上述例子中:holiday()函數為被裝飾的函數,其實際內存地址指向了inner()裝飾函數。也就是說如果我們想打印holiday()函數的名字、注釋等,實際打印的是inner()函數的函數名、注釋

那么怎么打印holiday()函數的名字跟注釋等方法呢?

這時候我們就用到另一個內置的裝飾器:wraps

如: 

from functools import wraps


def wrapper(func):  # func = holiday
    @wraps(func)
    def inner(*args, **kwargs):
        print('在被裝飾的函數執行之前做的事')
        ret = func(*args, **kwargs)
        print('在被裝飾的函數執行之后做的事')
        return ret
    return inner


@wrapper   # holiday = wrapper(holiday)
def holiday(day):
    ''' 這是一個放假通知 '''
    print('全體放假%s天'%day)
    return '好開心'

print(holiday.__name__)
print(holiday.__doc__)
該實例運行結果為:  holiday
          這是一個放假通知

  我們引入了內置functools模塊中的裝飾器wraps,這時候就可以正常打印被裝飾函數的名字、注釋等方法了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM