python版本 3.6
1.python的裝飾器說白了就是閉包函數的一種應用場景,在運用的時候咱們遵循
#開放封閉原則:對修改封閉,對拓展開放
2.什麼是裝飾器
#裝飾他人的器具,自己能夠是任意可調用的對象,被裝飾者也能夠是任意可調用對象 #裝飾器的原則:1.不可修改被裝飾對象的源代碼,2不修改被裝飾對象的調用方式 #裝飾器的目標:在遵循1和2的前提下,爲被裝飾對象添加上新功能
3.實現裝飾器以前先來了解閉包函數
#1.閉包函數 => 函數嵌套+函數對象+名稱空間與做用域 #閉:定義是在函數內的函數 #包:該內部函數須要訪問一個名字,該名字是屬於外層函數做用域的 #閉包函數實現的基本模板 def outter(xxx): def inner() xxx return inner #爲函數體傳參的兩個方案 #1.直接傳入參數 #2.在函數體內部定義變量
4.裝飾器的實現
#階段一 #計算一個函數執行的時間 import time def index(): time.sleep(1) print("welcome to my world") start = time.time() index() end = time.time() print("run time is %s" %(end - start)) #修改了裝飾對象的源代碼 #階段二 import time def index(): time.sleep(1) print("welcome to my world") def wrapper(): start = time.time() index() end = time.time() print("run time is %s" %(end - start)) #修改了裝飾對象的調用方式 #階段三 import time def index(): time.sleep(1) print("welcome to my world") def wrapper(func): start = time.time() func() end = time.time() print("run time is %s" %(end - start)) wrapper(index) #修改了裝飾對象的調用方式 #階段四: import time def index(): time.sleep(1) print('welcome to index page') def timmer(func): # func=最原始那個index的內存地址 def wrapper(): start=time.time() func() stop=time.time() print('run time is %s' %(stop - start)) return wrapper #把函數做爲參數傳進去,返回一個函數再去執行,替換返回的函數名爲以前傳入的函數 index=timmer(index) #index=wrapper的內存地址 index() #wrapper() #這樣就沒有修改被裝飾對象的源代碼和調用方式
5.裝飾器語法糖
#裝飾器語法糖 #在被裝飾器對象上方單獨一行寫:@裝飾器的名稱 解釋器一旦執行到@裝飾器的名字就會執行 原函數名 = 裝飾器的名字(正下方的那個函數) #修訂以後的裝飾器 import time def timmer(func): # func=最原始那個index的內存地址 def wrapper(*args,**kwargs): start=time.time()
res=func(*args,**kwargs) stop=time.time() print('run time is %s' %(stop - start)) return res return wrapper @timmer #index=timmer(最原始那個index的內存地址) #index=wrapper的內存地址 def index(): time.sleep(1) print('welcome to index page') index()
6.完善裝飾器
#裝飾器實現函數,其函數對象的變化,其中包括一些內置的方法__name__,__doc__等等, #這些都是要在被裝飾以後返回一樣的name,doc 下面咱們引入一個第三方包 去實現這些功能 import time from functools import wraps def timmer(func): @wraps(func) def wrapper(*args,**kwargs): start=time.time() #函數返回值 res=func(*args,**kwargs) stop=time.time() print('run time is %s' %(stop - start)) return res # wrapper.__doc__=func.__doc__ # wrapper.__name__=func.__name__ return wrapper # @timmer #index=timmer(最原始那個index的內存地址) #index=wrapper的內存地址 def index(): """ 這是一個index函數 :return: """ time.sleep(1) print('welcome to index page') #上面的引入的第三方包wraps,調用其裝飾器幫咱們實現了 # wrapper.__doc__=func.__doc__ # wrapper.__name__=func.__name__ 等等這些功能,這樣能更好的知足用戶的需求
7.上面實現的裝飾器是無參裝飾器,有參裝飾器更新中…………python