# -*- coding:utf-8 -*- def w1(show): def outer(a,b): print('添加新功能1') show(a,b) print('添加新功能2') return outer #@w1的做用就至關於w1(show),即執行w1(show)函數而且把show()函數的地址做爲參數傳進去,覺得製做 # 新show()函數作準備,返回的outer至關於新show()函數的地址。新outer()函數就是製做的 # 新show()函數,新show()函數在集成了舊show()函數的功能上,添加了新的功能 @w1 def show(a,b): print('a+b=%d'%(a+b)) show(2,3)
這個簡單裝飾器的執行流程是這樣的:首先把函數w1()讀到內存不執行(不被調用不會執行),而後到@w1------>w1(show)------>return outer------>至此,新的show()函數框架製做完成,而後再往裏面添加新功能就好了。------>show(2,3),此爲函數調用,注意,會調用新框架
show()函數,也就是outer()函數------>print('添加新功能1')------>show(2,3),調用舊的show(a,b)函數,即未被裝飾過的show(a,b)函數------>ide
print('a+b=%d'%(a+b)),執行結果是a+b=5------>print('添加新功能2')------>結束。函數
下面是本身隨便寫的一個很是簡單的帶裝飾器的函數:spa
1 def add(f3): 2 def f2(a,b): 3 print('add the first function') 4 f3(a,b) 5 print('add the second function') 6 return f2 7 8 @add 9 def f1(a,b): 10 print('the initial function') 11 print('a+b=%d'%(a+b)) 12 f1(3,2)