python中裝飾器的原理以及實現,

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

相關文章
相關標籤/搜索