python 之裝飾器 演變過程
阿新 • • 發佈:2018-12-26
需求如下
專案中定義了兩個函式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()
結論:這就是最終的方式