裝飾器顧名思義就是包裝,把函式包裝一下我們可以做什麼呢,我們可以在目標函式呼叫的前中後做一些事情,比如我們要統計乙個函式的執行時間,
def p():
print('hello world')
要統計函式p的執行時間,最直接的是直接在函式體修改,新增時間計算邏輯:
import time
def p(name):
start = time.time()
print('hello %s'%name)
end = time.time()
print('spend time is %s'%(end-start))
如果其他函式也要統計消耗時間,那其他函式同樣需要新增重複的時間計算邏輯,原本與業務無關的邏輯侵入到了業務**裡,**重複冗餘且很難擴充套件,公共部分難以重用,
倘若再新增其他諸如日誌統計,那麼**每次都需要重構,最簡單的我們可以將公共部分抽取出乙個函式:
import time
def show_time(func):
start = time.time()
func()
end = time.time()
print('spend time is %s'%(end-start))
show_time(p)
這樣我們將目標函式傳入到公共函式,就可以統計目標函式的執行時間了,但是目標函式需要顯式呼叫公共函式,而且公共函式暴漏在外面,況且目標函式引數傳遞不靈活,
那麼我們就可以用python的裝飾器了,將函式目標函式包裝一下:
import timedef show_time(func):
def proxy(*args,**kargs):
start=time.time()
print(args)
print(kargs)
func(args)
end=time.time()
print('spend %s'%(end-start))
return proxy
@show_timedef test(name):
print(name)
time.sleep(3)
是不是感覺有點像**模式,這就是面向切面的程式設計,需要抽象一把,python函式使用裝飾器可以無縫的將切面織入到業務邏輯裡,這樣就完成了切面的工作。
人生苦短,我用python。
python3 深入裝飾器
def outer c def inner uname print 我是 end c uname return inner outer def fun 1 uname print f 北京的 fun 1 mike def outer c def inner args,kwargs 通用的形參的設定 ...
Python3 高階 裝飾器
1.裝飾器功能 在不修改原函式的情況下,增強函式功能 2.不帶引數的函式 不帶引數的裝飾器 1 foo 被裝飾的函式 2 show time 是裝飾器 coding utf 8 import time def show time func def inner start time time.time...
python3裝飾器 高階
作用 優化裝飾器 from functools import wraps 匯入wraps def wraps f wraps的語法糖 def inner args,kwargs ret f args,kwargs return ret return inner deff1 print hello,w...