python 19 裝飾器高階

2021-10-09 13:02:37 字數 2541 閱讀 3047

假如我們寫了幾百個甚至更多的函式都用同乙個裝飾器,這時需不要使用裝飾器可怎麼辦?乙個乙個取消很現實

但是我們可以寫全域性的引數,讓其生效或不生效。本篇將用帶引數的裝飾器能解決此問題:

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...