1. 程式人生 > >Python面向切面程式設計的裝飾器模式

Python面向切面程式設計的裝飾器模式

裝飾器是什麼?他有什麼特點?

    裝飾器就是對被裝飾的物件(函式、類)進行重構的,其可以在不改變原來物件的情況下呼叫物件時執行重構後的行為
    
特點:  
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函式上還有裝飾器,然後從上往下繼續呼叫裝飾器。

執行效果:
在這裡插入圖片描述