假如我們寫了幾百個甚至更多的函式都用同乙個裝飾器,這時需不要使用裝飾器可怎麼辦?乙個乙個取消很現實
但是我們可以寫全域性的引數,讓其生效或不生效。本篇將用帶引數的裝飾器能解決此問題:
1、帶引數裝飾器,利用全域性變數,flag = true or false , # true 就走裝飾器 if ,否則不走裝飾器,例一:
import time
flag = true # true 就走裝飾器 if ,否則不走裝飾器
def timmer(f):
def inner(*args, **kwargs):
''' 多判斷乙個引數:flag,讓其執行或不執行裝飾函式 '''
if flag:
start = time.time()
ret = f(*args, **kwargs)
end = time.time()
print('已等待:', end-start)
return ret
else:
print('沒有等待')
ret = f(*args, **kwargs)
return ret
return inner
@ timmer
def gs(a):
time.sleep(1)
return '返回值:', a
2、裝飾器傳引數,三層函式的裝飾器,其實就在正常的裝飾器再套一層,將你要傳入的實引數成為裝飾器內的變數引數,例二:
import time
flag1 = true
def timmer_out(fg):
def timmer(f):
def inner(*args, **kwargs):
if fg:
start = time.time()
ret = f(*args, **kwargs)
end = time.time()
print('已等待:', end-start)
return ret
else:
print('沒有等待')
ret = f(*args, **kwargs)
return ret
return inner
return timmer
@ timmer_out(flag1)
def gs1(a):
time.sleep(1)
return '返回值:', a
兩種效果是一樣的,乙個是利用全域性變數,直接判斷了;
而後面這種就多巢狀一層函式在裝飾器,傳入引數,再用此引數判斷(有點間接性)
1、如下,既是呼叫多個裝飾器:
# 3、呼叫多個裝飾
# 俄羅斯套娃,上面到下面前置執行一次,然後下面到上面的後置執行一此
def inner1(*args, **kwargs):
res = func(*args, **kwargs)
return res
return inner1
def inner2(*args, **kwargs):
res = func(*args, **kwargs)
return res
return inner2
def f():
print('f')
return '拉回給你'
2、可以看到 f 函式上面@1、2的裝飾器,這裡只需要記住俄羅斯套娃一樣一層一層進,一層一層出。
執行結果如下:
3、得出順序:f 函式 @1、2 的裝飾器,順序為:
① 1 的 被裝飾函式前先執行;
② 2 的 被裝飾函式前先執行;
③ f 的 執行被裝飾函式,不包含返回值;
④ 2 的 被裝飾後的**執行;
⑤ 1 的 被裝飾後的**執行;
⑥ 「拉回給你」,被裝飾函式的返回值;
4、總結:你會發現就是那麼簡單,順序:1→2→被裝飾函式,不包含返回值→2→1→被裝飾函式返回值。
@的裝飾器距離最遠被裝飾函式那麼將先執行,簡單的例子:有3個函式,裝飾的順序為:1、2、3;那麼在執行時的順序為:1、2、3、3、2、1
python(19)編碼問題
python的編碼問題,一直都讓人很頭疼,今天就整理下python的編碼知識。首先 字串在python內部的表示是unicode編碼,因此,在做編碼轉換時,通常需要以unicode作為中間編碼,即先將其他編碼的字串解碼 decode 成unicode,再從unicode編碼 encode 成另一種編...
python 19 異常處理
什麼是異常處理?對於使用者輸入,不想讓使用者看見出錯資訊,對異常進行處理 異常處理的框架是什麼?try 可能出錯的程式1 可能出錯的程式2 程式1出錯了,不在執行程式2 except 錯誤 as e e接收出錯的值,想抓多個錯誤 錯誤1,錯誤2,建議用單獨乙個錯誤,多個錯誤處理原則上是統一處理錯誤。...
python高階裝飾器 Python裝飾器高階
對帶引數的函式進行裝飾 對帶引數的函式進行裝飾,內嵌包裝函式的形參和返回值與原函式相同,裝飾函式返回內嵌包裝函式物件 def deco func def deco a,b print before myfunc called.ret func a,b print after myfunc calle...