Python面向切面程式設計的裝飾器模式
阿新 • • 發佈:2018-11-19
裝飾器是什麼?他有什麼特點?
裝飾器就是對被裝飾的物件(函式、類)進行重構的,其可以在不改變原來物件的情況下呼叫物件時執行重構後的行為
特點:
1.修飾器本質上也是一個函式,
2.只不過這個函式接收其他函式作為引數
3.並對其進行一定的改造之後返回新函式
上例項:問:
定義一種方案,能在一個函式執行前輸出hello,執行後輸出byebye,並統計函式執行的時間?
def sayhello( func ): #func引數即為被裝飾的物件(這裡為a函式) def wrapper(*args,**kwargs): #裡面的引數為被裝飾物件的引數(這裡為:num) print("***hello***") return func(*args,**kwargs) #返回執行a函式 return wrapper #執行 wrapper()函式 def saybye(func): def wrapper(*args,**kwargs): #又開始執行a函式,但會發現還有一個rate裝飾器,於是開始執行rate函式 func(*args,**kwargs) print("***bye bye***") return wrapper def rate(func): def wrapper(*args,**kwargs): import datetime start=datetime.datetime.now() func(*args,**kwargs) #執行到這,裝飾器都呼叫完了所以開始執行a函式,繼續往下 end=datetime.datetime.now() print("***程式執行時間:"+str(end-start)) return wrapper @sayhello #使用 @+裝飾器名 的形式給 a函式裝飾一個sayhello裝飾器,以下一樣。 @saybye #一個函式被裝載多個裝飾器,按從上到下的順序執行。 @rate def a(num): nums=0 for i in range(num): nums+=i print(nums) a(100000) #當a函式被呼叫時,發現有裝飾器,先執行裝飾器即開始會執行sayhello裝飾器
執行過程:
當a函式被呼叫時,發現a函式上面有三個裝飾器:@sayhello ,@saybye ,@rate,於是找到第一個裝飾器即sayhello並開始先執行它,此時,sayhello裡的func引數即為a函式,執行sayhello函式,會返回一個wrapper物件,然後開始執行wrapper函式,裡面的引數即為傳入a函式的引數,執行wrapper裡的程式碼後return func(*args,**kwargs),即開始執行a函式,發現a函式上還有裝飾器,然後從上往下繼續呼叫裝飾器。
執行效果: