裝飾器
.functools. wraps
.帶參數的裝飾器
.多個裝飾器同一個函數
.functools. wraps
.帶參數的裝飾器
.多個裝飾器同一個函數
裝飾器本質:
1.為函數,功能是為其他函數添加附加功能。
2.開發原則: 開發封閉原則
3.裝飾器的作用: 在不改變原函數的的調用方式情況下,在函數的前後添加功能,不修改被修飾函數的源代碼
4.裝飾器的本質: 閉包含數
5.開放封閉原則
1.為函數,功能是為其他函數添加附加功能。
2.開發原則: 開發封閉原則
3.裝飾器的作用: 在不改變原函數的的調用方式情況下,在函數的前後添加功能,不修改被修飾函數的源代碼
4.裝飾器的本質: 閉包含數
5.開放封閉原則
裝飾器的組成: 裝飾器 = 高階函數 + 函數嵌套 + 閉包
主要目的:
寫一個計算時間的程序來計算程序運行的時間,然後在不破壞原本程序原碼的情況下,增加裝飾器讓他可以被調用,之後要再擴展都可以不用改動原本代碼。
1.寫一個簡單程序 來計算程序運行時間
運行結果:
要運行程序
0.010040044784545898
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
.
沒有留言:
張貼留言