簡單裝飾器:編程
寫代碼要遵循開發封閉原則,雖然在這個原則是用的面向對象開發,可是也適用於函數式編程,簡單來講,它規定已經實現的功能代碼不容許被修改,但能夠被擴展,即:函數式編程
封閉:已實現的功能代碼塊函數
開放:對擴展開發spa
def outer(function):
def inner():
print("123")
ret = function()
#return ret
return inner
@outer
def f1():
print("456")
f1()
運行後結果123 456
原理:將函數名f1看成參數傳進outer函數執行outer函數 而後再賦值給f1
f1 =outer(f1) function=f1
outer函數的返回值是inner函數名 因此f1 = inner
從新執行f1()就是執行inner() 因此執行完123 後執行456
能夠有多個參數
def w1(func):
2 def inner(arg1,arg2,arg3):
3 # 驗證1
4 # 驗證2
5 # 驗證3
6 return func(arg1,arg2,arg3)
7 return inner
8
9 @w1
10 def f1(arg1,arg2,arg3):
11 print 'f1'
能夠裝飾具備處理n個參數的函數的裝飾器
def w1(func):
def inner(*args,**kwargs):
# 驗證1
# 驗證2
# 驗證3
return func(*args,**kwargs)
return inner
@w1
def f1(arg1,arg2,arg3):
print 'f1'
多個裝飾器應用到同一個函數
def outer(function):
def inner(*args,**kwargs):
print("123")
function(*args,**kwargs)
# return ret
return inner
def outer1(function):
def inner1(*args,**kwargs):
print("wangyao")
function(*args,**kwargs)
return inner1
@outer
@outer1
def f1(a1,a2,a3):
print("456")
f1(1,2,3)結果是123 wangyao 456@outer1被替換成inner1()函數再將inner1()函數應用到@outer裝飾器中