python裝飾器複習

裝飾器是python中比較重要的一個概念,要理解裝飾器,先理解下變量的作用域、閉包、閉包函數。

簡單用個閉包函數舉例

def func():
    v_name = 'hello world'
    def function():
        print(v_name)
    return function

func()

參考下面的執行結果,在func()函數中,創建一個子函數function(),當調用func()的時候,retrun的fcuntion,這樣就會直接去調用子函數function,func中的變量v_name可直接被引用。注意此時return的時候function,並不是function()

裝飾器的應用場景:不改變執行函數,在函數外面再加入某些屬性,這樣就大大增加了函數的擴展性和維護性。比如我想統計每個方法執行下來需要的時間。常規做法就是在每天方法的開始和結尾加上時間函數來統計。但是如果用裝飾器,就簡單多了。只需要新增一個方法如下:

def func(run):
    def wrapper():
        starttime=time1
        run()  #執行函數
        endtime=time2
        return (time2-time1)
    return wrapper

@func
def run():
    ******

其中run就是原函數,我們需要來統計它的執行時間。上面的@func就是裝飾器,可以理解爲run=func(run)  ,當執行run()的時間,相當於變成了fun=func(run)().,最後被執行的部分就是wrapper方法了。

引申來,當存在參數的時候,就需要在外面再嵌套一層,參數也傳遞到wrapper中來,簡單的例子如下:

import time
def dd(parameter):
    def timer(func):
        def wrapper(*args):
            print ('time1 is 1',parameter)
            func(*args)
            print ('now time is 2')
        return wrapper
    return timer

@dd('bibi')
def test(value):
    time.sleep(1)
    print (value)
    
test('ggggg')

上面的執行等價於下面的

import time
def dd(parameter):
    def timer(func):
        def wrapper(*args):
            print ('time1 is 1',parameter)
            func(*args)
            print ('now time is 2')
        return wrapper
    return timer
#@dd('12')
te=dd('123')
def test(value):
    time.sleep(1)
    print (value)

te(test)('value')

箭頭的順序大致就是程序執行的流程,還沒完全理解,所以部分知識點沒有說的很透徹。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章