2018年11月10日 星期六

python - 裝飾器、語法糖、調用函數


裝飾器

.functools. wraps
.帶參數的裝飾器
.多個裝飾器同一個函數 

裝飾器本質: 
1.為函數,功能是為其他函數添加附加功能。
2.開發原則:  開發封閉原則
3.裝飾器的作用:  在不改變原函數的的調用方式情況下,在函數的前後添加功能,不修改被修飾函數的源代碼
4.裝飾器的本質:  閉包含數
5.開放封閉原則


裝飾器的組成:
裝飾器  =  高階函數  +  函數嵌套 + 閉包



 主要目的: 
寫一個計算時間的程序來計算程序運行的時間,然後在不破壞原本程序原碼的情況下,增加裝飾器讓他可以被調用,之後要再擴展都可以不用改動原本代碼。


1.寫一個簡單程序 來計算程序運行時間

import  time

def  func():
    start = time.time()
    print("要運行程序")
    time.sleep(0.01)#等待時間    end =  time.time()
    print(end - start)

func()

運行結果: 
要運行程序

0.010040044784545898






2.加入一個可以調用的函數,這樣可以方便給其他人調用,不管誰
只要想使用這功能就可以調用,但是這樣會修改到原本調用得名稱,
原本調用的是func(),但這邊被修改了!所以要使用裝飾器把這功能
加入只要使用func()就可以增加其他函數功能。
import  time

def timmer(f):
    start = time.time()
    f()
    end = time.time()
    print(end - start)



def  func():
    print("要運行程序")
    time.sleep(0.01)#等待時間
timmer(func)
運行結果: 
要運行程序
0.010941743850708008




3.使用閉包來修改,讓程序只要使用func()也可以調用函數
import  time

def timmer(f):
    def inner():
        start = time.time()
        f()
        end = time.time()
        print(end - start)
    return  inner

def  func():
    print("要運行程序")
    time.sleep(0.01)#等待時間
func =  timmer(func)
func()
運行結果: 
要運行程序
0.01000070571899414

執行步驟:
語法糖
import  time

def timmer(f):
    def inner():
        start = time.time()
        f()
        end = time.time()
        print(end - start)
    return  inner

@timmer            #語法糖 @裝飾器函數名def  func():       #被裝飾的函數    print("要運行程序")
    time.sleep(0.01)#等待時間
#func =  timmer(func)  因語法糖屏蔽func()
執行結果:
要運行程序
0.010973453521728516



.調用得數據為空


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.01)
    print('被調用的函數',a,b)
    return  '增加數據'
def wrapper():
    def inner():
        pass    return  inner

.調用數據
def wrapper(func): #abcce    def inner(*args,**kwargs):
        ret = func(*args,**kwargs)   #被裝飾的函數        return  ret
    return  inner

@wrapper   #abcce = wrapper(abcce)def abcce():
    print(1232)
ret = abcce() #inner

執行結果:
1232
.

沒有留言:

張貼留言