1. 程式人生 > >day 11 - 1 裝飾器

day 11 - 1 裝飾器

裝飾器

 

裝飾器形成的過程 : 最簡單的裝飾器——有返回值的——有一個引數——萬能引數
裝飾器的作用:不想修改函式的呼叫方式 但是還想在原來的函式前後新增功能
原則 :開放封閉原則
語法糖 :@裝飾器函式名
裝飾器的固定模式

 

原則:開放封閉原則
開放:對擴充套件是開放的
封閉:對修改是封閉的

 

首先我們來逐步實現這麼一個功能吧

計算程式碼執行的時間

#先來看下需要的元件
import time  #time 模組

time.time()       #獲取當前時間
time.sleep(5)      #讓程式睡眠多少時間

print(time.time()) #
來試下

我們來寫一個可以計算時間的函式

def func():
    start=time.time()
    time.sleep(0.1)   #時間太短 系統會顯示 0.0,所以我們讓他休眠 0.1s
    print("計算程式執行的時間")
    end=time.time()
    print(end-start)

func()

但是這裡有一個問題:如果要計算很多函式的執行時間,那不是要在函式中都加上幾行計算的程式碼,這顯然是不可行的,一般寫好的沒問題的函式,是不會去對它進行修改,而且還很麻煩

所以這裡我們寫一個計算時間的函式獨立出來

def times(f):
    start
=time.time() time.sleep(0.1) f() end=time.time() print(end-start) def func(): print("計算程式執行的時間") def func2(): print(time.sleep(5)) times(func) times(func2)

但是這樣貌似還有一個問題,我要計算時間的函式只能一個一個的執行,或者寫 n 個 time() 來呼叫

接著我們來了解下裝飾器吧,解決這樣的問題

先來寫一個簡單的裝飾器

#待完善

 

裝飾器的固定模式

def wrapper(f):     #裝飾器函式,f是被裝飾的函式
    def inner(*args,**kwargs):    #定義一個內建函式,且和下面統級別的返回值名字一致且不加括號
                                  #動態引數一定要原封不動的傳給 被裝飾的函式 f()
        '''在被裝飾函式之前要做的事'''
        ret = f(*args,**kwargs)   #被裝飾的函式  函式執行完的返回值要原封不動傳給 return
        '''在被裝飾函式之後要做的事'''
        return ret
    return inner

@wrapper         #語法糖 @裝飾器函式名 等價於 func = wrapper(func)
def func(a,b):     #被裝飾的函式
    time.sleep(0.01)
    print('你好:世界',a,b)
    return '新年好'
#print(func(23,45))  #接收返回值
ret = func(23,45)   #接收返回值
print(ret)