1.裝飾器的理解
裝飾器是程序開發中經常會用到的一個功能,用好了裝飾器,開發效率如虎添翼,所以這也是Python面試中必問的問題,但對于好多初次接觸這個知識的人來講,這個功能有點繞,自學時直接繞過去了,然后面試問到了就掛了,因為裝飾器是程序開發的基礎知識,這個都不會,別跟人家說你會Python,看了下面的文章,保證你學會裝飾器。
裝飾器,功能就是在運行原來功能基礎上,加上一些其它功能,比如權限的驗證,比如日志的記錄等等。不修改原來的代碼,進行功能的擴展。
比如java中的動態代理,python的注解裝飾器
其實python的裝飾器,是修改了代碼。
2.多個裝飾器
3.裝飾器(decorator)功能
1.引入日志
2.函數執行時間統計
3.執行函數前預備處理
4.執行函數后清理功能
5.權限校驗等場景
6.緩存
4.裝飾器示例
1.無參數的函數
上面代碼理解裝飾器執行行為可理解成
foo = timefun(foo)
foo先作為參數賦值給func后,foo接收指向timefun返回的wrappedfunc
foo()
調用foo(),即等價調用wrappedfunc()
內部函數wrappedfunc被引用,所以外部函數的func變量(自由變量)并沒有釋放
func里保存的是原foo函數對象
2:被裝飾的函數有參數
3:被裝飾的函數有不定長參數
4:裝飾器中的return
如果修改裝飾器為return func(),則運行結果:
總結:
·一般情況下為了讓裝飾器更通用,可以有return
5.裝飾器帶參數,在原有裝飾器的基礎上,設置外部變量
6:類裝飾器(擴展)
裝飾器函數其實是這樣一個接口約束,它必須接受一個callable對象作為參數,然后返回一個callable對象。在Python中一般callable對象都是函數,但也有例外。只要某個對象重寫了__call__()方法,那么這個對象就是callable的。
#說明:
#1.當用Test來裝作裝飾器對test函數進行裝飾的時候,首先會創建Test的實例對象
#并且會把test這個函數名當做參數傳遞到__init__方法中
#即在__init__方法中的func變量指向了test函數體
#
#2. test函數相當于指向了用Test創建出來的實例對象
#
#3.當在使用test()進行調用時,就相當于讓這個對象(),因此會調用這個對象的__call__方法
#
#4.為了能夠在__call__方法中調用原來test指向的函數體,所以在__init__方法中就需要一個實例屬性來保存這個函數體的引用
#所以才有了self.__func = func這句代碼,從而在調用__call__方法中能夠調用到test之前的函數體
@Test
deftest():
print("----test---")
test()
showpy()#如果把這句話注釋,重新運行程序,依然會看到"--初始化--"