1. 程式人生 > >python 之裝飾器 演變過程

python 之裝飾器 演變過程

需求如下
專案中定義了兩個函式foo和bar 這是公共函式。現在需要在調取這兩個函式的基礎上 計算函式執行的時間。(原則不修改foo和bar函式)

演變一:

這種方式是直接在原函式的內部修改原始碼 太過於簡單 就不寫了。這種方式缺點太多,涉及到直接修改函式原始碼了。方式不可取。

演變二

import time


def foo():
    time.sleep(1)
    print('foo......')


def bar():
    time.sleep(1)
    print('bar......')


def show_time(f):
    start_time = time.time()
    f()
    end_time = time.time()
    print('spend time %s'
%(end_time - start_time)) show_time(bar)

結論 :如果想要調取foo 那就直接調取show_time(foo) 如果想要調取bar 直接show_time(bar) 即可。但是目前的缺陷是:本來是調取foo 現在變成調取show_time 改變了調取的方式。雖然實現了功能但是改變函式名是不可取的。

演變三

import time


def foo():
    time.sleep(1)
    print('foo......')


def bar():
    time.sleep(1)
    print('bar......'
) def show_time(f): def inner(): start_time = time.time() f() end_time = time.time() print('spend time %s'%(end_time - start_time)) return inner foo = show_time(foo) bar = show_time(bar) foo() bar()

結論:功能基本上已經實現 但是這種寫法 不好看,每一個函式都需要進行賦值。

演變四

import time


def
show_time(f):
def inner(): start_time = time.time() f() end_time = time.time() print('spend time %s'%(end_time - start_time)) return inner @show_time # foo = show_time(foo) def foo(): time.sleep(1) print('foo......') @show_time # bar = show_time(bar) def bar(): time.sleep(1) print('bar......') foo() bar()

結論:這就是最終的方式