裝飾器 裝飾器就是閉包函數的一種應用場景一 爲什麼要用裝飾器 #開放封閉原則:對修改封閉,對擴展開放二 什麼是裝飾器 裝飾器他人的器具,自己能夠是任意可調用對象,被裝飾者也能夠是任意可調用對象。 強調裝飾器的原則: 1 不修改被裝飾對象的源代碼 2 不修改被裝飾對象的調用方式 裝飾器的目標:在遵循1和2的前提下,爲被裝飾對象添加上新功能三 裝飾器的使用 1. 無參裝飾器 def 裝飾器名字(func): def wrapper(*args,**kwargs): #func是被裝飾的對象,這裏能夠寫執行前的功能 res=func(*args,**kwargs) # 這裏能夠寫執行後的功能 return res return wrapper @裝飾器名字 #被裝飾的函數名字 = 裝飾器名字(被裝飾的函數內存地址) def 被裝飾的函數名字(): pass 2. 有參裝飾器 def 裝飾器名字(參數1,參數2,...): def outter(func): def wrapper(*args,**kwargs): res=func(*args,**kwargs) return res return wrapper return outter @裝飾器名字(值1,值2,...) #@outter def 被裝飾的函數名字(): pass3. 語法糖:在被裝飾對象正上方單獨一行寫 無參:@裝飾器的名字 有參:@裝飾器的名字(arg1,arg2,...) @timmer # index=timmer(index) def index(): pass @auth2(engine='file') # @名字 # index=名字(index) def index(): pass 疊加多個裝飾器 @deco1 @deco2 @deco3 def index(): pass 解釋語法的順序:自下而上,deco3=》deco2=》deco1 調用index()時纔開始觸發裝飾器內部閉包函數的執行,閉包函數執行順序是:自上而條, deco1.wrapper1=>deco2.wrapper2=>deco3.wrapper3 wrapper.__name__=func.__name__ (函數名字賦值) wrapper.__doc__=func.__doc__ (註釋的內用賦值#)