python 裝飾器(二): 加參數

接上篇python 閉包&裝飾器(一)html

1、功能函數加參數:實現一個能夠接收任意數據的加法器python

源代碼以下:閉包

def show_time(f):

    def inner(*x, **y):     # 形參
        start = time.time()
        f(*x, **y)     # 至關於add()
        end = time.time()
        print('spend %s' % (end - start))

    return inner

@show_time  # @show_time 等於 add = show_time(add)
def add(*a, **b):   # 實參  能夠接收任意參數
    sums = 0
    for i in a:
        sums += i
    print(sums)
    time.sleep(1)

add(1, 2, 3, 4, 5)    # 15

2、裝飾器函數加參數:根據需求打印日誌函數

源代碼以下:spa

def logger(flag=''):      # flag 默認爲空,這一層函數的做用是應用標誌位
    def show_time(f):
        def inner(*x, **y):
            start = time.time()
            f(*x, **y)           # 至關於add()
            end = time.time()
            print('spend %s' % (end - start))
            if flag == 'true':
                print('打印日誌')

        return inner
    return show_time


@logger('true')     # @show_time
def add(*a, **b):    # 無論有名參數和無名參數均可以接收到
    sums = 0
    for i in a:
        sums += i
    print(sums)
    time.sleep(1)

add(1, 2, 3, 4, 5)


@logger('true')
def bar():
    print('bar.......')
    time.sleep(3)    # 停留3秒

bar()

注意:@logger('true') 的執行機制是:先執行 logger('true') 函數,而後返回 show_time 函數的內存地址, 因此 @logger('true') 就至關於 @show_time,二者的區別就是 @logger('true') 要了一個變量flag, 以後的裝飾器函數裏面就能夠使用falg這個標誌位了日誌

相關文章
相關標籤/搜索