裝飾器是什麼,有什麼功能,能用在什麼業務場景?

2021-08-20 00:07:04 字數 1916 閱讀 2975

概念:

1.裝飾器的實現是由閉包支撐的;

2.裝飾器本質上是⼀個

python

函式,它可以在讓其他函式在不需要做任何**的變動的

前提下增加額外的功能;

3.裝飾器的返回值也是⼀個函式的物件,它經常用於有切面需求的場景,實現路由傳參,

flask

的路由傳參依賴於裝飾器,瀏覽器通過

url訪問到裝飾器的路由,從而訪問檢視函式獲得返回的

html

頁面;應用場景:

1.可以在外層函式加上時間計算函式,計算函式執行時間;

2.計算函式執行次數;

3.可以用在框架的路由傳參上;

4.插入日誌,作為函式的執行日誌;

5.事務處理,可以讓函式實現事務的一致性,讓函式要麼一起執行成功,要麼一起執行失敗;

6.快取,實現快取處理;

7.許可權的校驗,在函式外層套上許可權校驗的**,實現許可權校驗;

寫出乙個單例的裝飾器(使乙個本來不是單例類的類變成單例類

))[python] 

view plain

copy

defset_func(func):  

__singleton = none

defcall_func(*args, **kwargs):  

nonlocal __singleton  

ifnot

__singleton:  

__singleton = func(*args, **kwargs)  

return

__singleton  

else

:  return

__singleton  

return

call_func  

@set_func

class

std(object):  

def__init__(

self

, name, age):  

self

.name = name  

self

.age = age  

s2 = std('jack',18

)  print

(id(s2),s2.name,s2.age)  

s1 = std('leo',23

)  print

(id(s1),s1.name,s1.age)  

執行結果:

[python] 

view plain

copy

139727292442832

jack 

18139727292442832

jack 

18[python] 

view plain

copy

deflogin_required(view_func):  

"""自定義裝飾器判斷使用者是否登入"""

@wraps

(view_func)  

def"""具體實現判斷使用者是否登入的邏輯"""

user_id = session.get('user_id'

)  if

notuser_id:  

return

jsonify(errno=ret.sessionerr, errmsg=

'使用者未登入'

)  else

:  g.user_id = user_id  

return

view_func(*args, **kwargs)  

return

總結:裝飾器是python三大神器(迭代器,生成器,裝飾器)中比較難理解的,但是它的本質實際上就是閉包,我們在閉包函式或者類外面封裝了一套邏輯,因此可以增強函式的功能,增加許可權校驗,事務一致性,快取等功能,這就是裝飾器,使漂亮的姑娘(函式)變得更加漂亮。

裝飾器模式是什麼?

咖啡店裡咖啡中可以加不同的配料 摩卡 牛奶 糖 奶泡 不同的飲品加上不同的配料有不同的價錢,怎樣實現呢?可能你的第一印象會想到使用繼承,1.首先定義乙個咖啡基類 2.對於加糖的,加牛奶的,加摩卡的 加奶泡的,分別寫乙個子類繼承 3.對於加糖,又加奶的寫乙個類,對於對於加糖,又摩卡的寫乙個類,對於對於...

Python合集之Python是什麼,有什麼用?

python最近兩年來,這個詞語頻繁的出現在大家的視線之中,但是python到底是什麼呢,有什麼用途呢,為什麼最近大家這麼熱衷於它呢?python它其實是一種程式語言,是由荷蘭人 guido van rossum 發明的一種物件導向的解釋型高階程式語言。python的發明者,在一開始開發這門語言的初...

mysql 約束是什麼 mysql中約束有什麼用

什麼叫做約束?約束,就是要求資料需要滿足什麼條件的一種 規定 主要有如下幾種約束 主鍵約束 形式 primary key 欄位名 含義 作用 使該設定欄位的值可以用於 唯一確定一行資料 其實就是 主鍵 的意思。唯一約束 形式 unique key 欄位名 含義 作用 使該設定欄位的值具有 唯一性 自...