天天看點

自學Python4.3-裝飾器固定格式

自學Python4.3-裝飾器固定格式

自學Python之路

自學Python4.3-裝飾器固定格式

1.裝飾有傳回值的裝飾器

import  time
print(time.time())

def timmer(f):    #裝飾器函數
    def inner():
        start = time.time()
        ret = f()       #被裝飾的函數
        end = time.time()
        print(end - start)
        return ret
    return inner

@timmer         #文法糖 @裝飾器函數名
def func():     #被裝飾的函數
    time.sleep(0.01)
    print('我好喜歡大家啊~')
    return '新年好'
# func = timmer(func)
ret = func()   #inner()
print(ret)        

以上代碼:

   執行timmer(func), 傳回inner  (此時此刻func就是inner)  執行func的時候就是執行inner, 是以在inner裡面加個傳回值

2. 裝飾帶參數函數的裝飾器

2.1 如果被裝飾函數有參數, 有一個參數:

import  time
print(time.time())

def timmer(f):    #裝飾器函數
    def inner(a):
        start = time.time()
        ret = f(a)       #被裝飾的函數
        end = time.time()
        print(end - start)
        return ret
    return inner

@timmer         #文法糖 @裝飾器函數名
def func(a):     #被裝飾的函數
    time.sleep(0.01)
    print('我好喜歡大家啊',a)
    return '新年好'
# func = timmer(func)
ret = func(1)   #inner()
print(ret)
      
自學Python4.3-裝飾器固定格式

2.2  如果被裝飾函數有參數, 有2個參數:

import  time
print(time.time())

def timmer(f):    #裝飾器函數
    def inner(a,b):
        start = time.time()
        ret = f(a,b)       #被裝飾的函數
        end = time.time()
        print(end - start)
        return ret
    return inner

@timmer         #文法糖 @裝飾器函數名
def func(a,b):     #被裝飾的函數
    time.sleep(0.01)
    print('我好喜歡大家啊',a,b)
    return '新年好'
# func = timmer(func)
ret = func(2598,2417)   #inner()
print(ret)
      
自學Python4.3-裝飾器固定格式

2.3  如果被裝飾函數有2個,一個函數有1個參數, 另一個函數有2個參數:

import  time
print(time.time())

def timmer(f):    #裝飾器函數
    def inner(*args):
        start = time.time()
        ret = f(*args)       #被裝飾的函數
        end = time.time()
        print(end - start)
        return ret
    return inner

@timmer         #文法糖 @裝飾器函數名
def func1(a):     #被裝飾的函數func1
    time.sleep(0.01)
    print('我好喜歡大家啊',a)
    return '新年好'
# func = timmer(func)
def func2(a,b):     #被裝飾的函數func2
    time.sleep(0.01)
    print('我愛大家啊',a,b)
    return '過年好'
# func = timmer(func)
ret = func1(48785)   #inner()
ret = func2(2598,2417)   #inner()
print(ret)
      
自學Python4.3-裝飾器固定格式

以上隻解決了按位置傳參數, 但是如果按關鍵字傳參數就會有問題。于是,  可傳萬能參數

import  time
print(time.time())

def timmer(f):    #裝飾器函數
    def inner(*args,**kwargs):
        start = time.time()
        ret = f(*args,**kwargs)       #被裝飾的函數
        end = time.time()
        print(end - start)
        return ret
    return inner

@timmer         #文法糖 @裝飾器函數名
def func1(a):     #被裝飾的函數func1
    time.sleep(0.01)
    print('我好喜歡大家啊',a)
    return '新年好'
# func = timmer(func)
def func2(a,b):     #被裝飾的函數func2
    time.sleep(0.01)
    print('我愛大家啊',a,b)
    return '過年好'
# func = timmer(func)
ret = func1(48785)   #inner()
ret = func2(2598,b=2)   #inner()
print(ret)
      
自學Python4.3-裝飾器固定格式

3. 引出---裝飾器的固定格式

def wrapper(f):    #裝飾器函數,f是被裝飾的函數
    def inner(*args,**kwargs):
        '''在被裝飾函數之前要做的事'''
        ret = f(*args,**kwargs)    #被裝飾的函數
        '''在被裝飾函數之後要做的事'''
        return ret
    return inner
@wrapper         #文法糖 @裝飾器函數名
def func(a,b):     #被裝飾的函數
    time.sleep(0.01)
    print('我好喜歡大家',a,b)
    return '新年好'
ret = fucn()
      

  

...

posted on 2019-03-21 16:11 CARLOS_CHIANG 閱讀(...) 評論(...) 編輯 收藏