def w1(func):
def inner():
print('---正在驗證---')
func() #閉包
return inner
def f1():
print ('-----f1-----')
def f2():
print ('-----f2-----')
f1 = w1(f1) #呼叫的 f1 發生改變
f1()
#在沒有修改 f1 引用的前提下,完成對 f1 的擴充套件
執行結果:
在很多情況下,我們想在程式原基礎上增加一些功能,但又不能直接修改**,可以通過裝飾器,完成對函式的擴充套件。
修改**如下:
def w1(func):
print('---正在裝飾---')
def inner():
print('---正在驗證---')
func()
return inner
@w1 #只要python執行到這個**,就會自動裝飾,不需要等待呼叫
def f1():
print ('-----f1-----')
#實際上,在呼叫f1之前,已經完成了裝飾器的呼叫
f1()
執行結果:
【補充】
1.有引數函式的修飾
我們在上面討論的裝飾器是不含引數的,當我們需要裝飾傳遞引數的函式時,就需要在裝飾器內的函式上動手。
程式如下:
def func(functionname):
print ('-----func----1-')
def func_in(a,b): #【這裡傳引數】如果沒有定義a,b 會導致呼叫test(10,12)失敗
print ('-----func_in-1-')
functionname(a,b) #【這裡傳引數】 如果沒有傳遞a,b 會導致呼叫def test(a,b)失敗
print ('-----func_in-2-')
print ('-----func---2-')
return func_in
@func
def test(a,b):
print ('-----test-a=%d,b=%d---'%(a,b))
test(10,12)
執行結果如下:
**當傳遞不定長的引數時,將閉包中的a,b改為*args,**kwargs 即可
程式:
def func(functionname):
print ('-----func----1-')
def func_in(*args,**kwargs):
print ('-----func_in-1-')
functionname(*args,*kwargs)
print ('-----func_in-2-')
print ('-----func---2-')
return func_in
@func
def test(a,b,c,d):
print ('-----test-a=%d,b=%d,c=%d,d=%d---'%(a,b,c,d))
test(10,12,24,55)
結果:
我們可以發現,在面對需要傳遞引數的函式,我們在修飾函式時,只要在閉包的函式和引用的函式上傳遞引數就可以。
2.有返回值的函式的修飾
程式如下:
def func(functionname):
print ('-----func----1-')
def func_in():
print ('----func_in-1-')
ret = functionname() #儲存 返回的haha
print ('-----func_in-2-')
return ret #把haha返回到 ret=test()處的呼叫
print ('-----func----2-')
return func_in
@func
def test():
print ('-----test-----')
return 'haha'
ret = test()
print ('test return value is %s'%ret)
python裝飾器學習
1 裝飾器的本質 閉包函式 2 裝飾器的作用 在不改變原函式的呼叫方式情況下,給原函式增加其他功能。3 開發原則 開放封閉原則。4 語法 裝飾器函式名 閉包函式 巢狀函式,內部函式呼叫外部函式的變數。def outer arg1 def inner print arg1 return inner i...
python學習(裝飾器)
裝飾器就是閉包的具體使用,可以不改變原來的函式 對其功能進行擴充。import time def outer func def inner num t1 time.time func num t2 time.time print 時間為 t2 t1 return inner outer def fu...
Python學習 裝飾器
裝飾器作為乙個函式,可以為其他函式在不修改原函式 的前提下新增新的功能 裝飾器的返回值是乙個函式物件。它經常用於有切面需求的場景,比如 插入日誌 效能測試 事務處理 快取 許可權校驗等。裝飾器,可以讓我們抽離出大量與函式功能本身無關的相同 並在裝飾器函式中使用 一 作用域 二 高階函式 三 閉包 l...