1. 程式人生 > >10-3 函數裝飾器

10-3 函數裝飾器

python **kwargs 開放 開放封閉原則 函數名 不想 返回 多個參數 app

裝飾器形成的過程

  最簡單的裝飾器----有返回值的----有一個參數----萬能參數裝飾器的作用:


不想修改函數的調用方式,但是還想再原來的函數前後添加功能#原則:開放封閉原則
開放: 對擴展是開放的
封閉: 對修改是封閉的
語法糖:@裝飾器函數名,@timmer等價於func = timmer(func),其中func()是被裝飾函數,timmer()就是裝飾器函數

最簡單的裝飾器技術分享圖片

import time
def timmer(f):
    start = time.time()
    f()
    end = time.time()
    print(end-start)
def func():
    time.sleep(0.1)
    print(‘nice!‘)
timmer(func)

裝飾有返回值的裝飾器

import time
#timmer()就是裝飾器函數,只是對一個函數有裝飾作用
def timmer(f):#通過此閉包函數返回一個內部函數名,然後在外部接收,讓接收的函數名與外部函數名保持一致即可
    def inner():
        start = time.time()
        ret = f()      #被裝飾的函數
        end = time.time()
        print(end-start)
        return ret
    return inner

@timmer     #語法糖---@裝飾器函數名,等價於func = timmer(func)
def func():     #    被裝飾的函數
    time.sleep(0.1)
    print(‘nice!‘)
    return ‘summertrain‘
# func = timmer(func)
result = func()
print(result)

有一個參數

import time
#timmer()就是裝飾器函數
def timmer(f):#通過此閉包函數返回一個內部函數名,然後在外部接收,讓接收的函數名與外部函數名保持一致即可
    def inner(a):
        start = time.time()
        ret = f(a)      #被裝飾的函數
        end = time.time()
        print(end-start)
        return ret
    return inner

@timmer     #語法糖---@裝飾器函數名,等價於func = timmer(func)
def func(a):     #    被裝飾的函數
    time.sleep(0.1)
    print(‘nice!‘,a)
    return ‘summertrain‘
# func = timmer(func)
result = func(1)
print(result)

萬能參數

#裝飾帶多個參數,且包括按照位置以及參數傳參的裝飾器
import time
#timmer()就是裝飾器函數
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     #語法糖---@裝飾器函數名,等價於func = timmer(func)
def func(a,b):     #    被裝飾的函數
    time.sleep(0.1)
    print(‘nice!‘,a,b)
    return ‘summertrain‘
# func = timmer(func)
result = func(1,b=22)
print(result)

裝飾器的固定模式

#例子
import time
def wrapper(f):     #   f是被裝飾的函數
    def inner(*args,**kwargs):
        ‘‘‘在被裝飾函數之前要做的事兒‘‘‘
        ret = f(*args,**kwargs)
        ‘‘‘在被裝飾函數之前要後的事兒‘‘‘
        return ret
    return inner

@wrapper
def func(a,b):
    time.sleep(0.1)
    print(‘nice!‘,a,b)
    return ‘summertrain‘



#減縮版
def wapper(func):
    def inner(*args,**kwargs):
        ret = func(*args,**kwargs)
        return ret
    return inner
@wapper
#qqxing = wapper(qqxing)
def qqxing():
    print(1111)
result = qqxing()

  

10-3 函數裝飾器