自學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)
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)
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)
以上隻解決了按位置傳參數, 但是如果按關鍵字傳參數就會有問題。于是, 可傳萬能參數
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)
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 閱讀(...) 評論(...) 編輯 收藏