裝飾器是方便開發(fā)根據(jù)產(chǎn)品經(jīng)理調(diào)整代碼的過程
只用語言描述很難理,下面直接看樣例代碼
1?? def outer(fun):
3? ?? ? def wrapper(age):#遇見函數(shù)先放在內(nèi)存
6? ? ? ? ? ? ? print ("a")
7? ? ? ? ? ? ? print ("b")
?????? ? ? ??? fun(age )
9? ? ? ? ? ? ? print ("最后")
4? ? ? return wrapper
2 @outer#相當回去執(zhí)行outer(),并且傳入的參數(shù)為foo,最終執(zhí)行的是outer(foo)
?def foo(age):
8? ? print ('a',age)
#在上面執(zhí)行完之后,相當于重新定義了一個foo函數(shù)
‘’‘
foo()=def wrapper(age): ? print ("a")?? print ("b") ? fun(age )?? print ("最后")#主要是wrapper的return
'''
5 foo("age")
這部分代碼的前面是我打上的程序運行順序,方便解釋和理解
首先,如果我們現(xiàn)在定義一個函數(shù)foo(),print是a,后面產(chǎn)品經(jīng)理 要求 在加一個print b,我們直接加上就行,但是如果我們不是一個函數(shù),而是成千上百個函數(shù),這樣如果我們在一個個加是不是會瞬間爆炸,裝飾器就是解決這個爆炸心情的關(guān)鍵
我們在foo主函數(shù)前面定義了一個outer函數(shù),這個函數(shù)就是裝飾器的關(guān)鍵,而且這個函數(shù)是函數(shù)套函數(shù),函數(shù)的執(zhí)行方式我們都懂的,但是怎么樣使outer函數(shù)與foo函數(shù)相連呢,這個時候就用到了@outer,這個是裝飾器與函數(shù)鏈接的關(guān)鍵,在這個地方@outer就等于outer(foo),通過這樣的方式,遇到產(chǎn)品經(jīng)理要求改的時候我們只要修改 outer里面的函數(shù)就行了,這就是裝飾器的方便之處
在執(zhí)行函數(shù)方面,def的函數(shù)是先存在內(nèi)存里面,調(diào)用的時候才會執(zhí)行,同時注意如果需要加參數(shù)時,參數(shù)添加的位置