您是否有這樣的煩惱?
研究很長時間裝飾器了但是還不明白裝飾器是什麼東西?裝飾器能幹什麼?明明上次感覺有點眉目了,但是感覺沒內味。
今天希望通過這篇文章能讓您知道裝飾器到底是什麼?
裝飾器模式(decorator簡單一點說就是在原有函式基礎上新增方法,讓被裝飾的函式執行裝飾函式的**。pattern)允許向乙個現有的物件新增新的功能,同時又不改變其結構。這種型別的設計模式屬於結構型模式,它是作為現有的類的乙個包裝。
這裡有乙個例子:
import time
# 是否為質數
defis_prime
(num)
:if num <2:
return
false
elif num ==2:
return
true
else
:for i in
range(2
, num)
:if num % i ==0:
return
false
return
true
# 計算時間
defprime_nums()
: t1 = time.time(
)for i in
range(2
,10000):
if is_prime(i)
:print
(i) t2 = time.time(
)print
(t2 - t1)
prime_nums(
)
從上面**可以看出prime_nums既有邏輯的部分(列印質數),也有計算時間的部分所以可以看出**可讀性非常的低,想要變這樣的問題需要用到裝飾器。
這段**等同於將計時與操作分開寫,之後利用裝飾器的特性將兩段**結合起來
import time
# func等同於我等一下要執行這個函式
defdiaplay_time
(func)
:# 該函式表示要執行哪些內容
def():
t1 = time.time(
)# 這裡表示執行函式-->裝飾誰就執行誰
func(
) t2 = time.time(
)print
(t2 - t1)
defis_prime
(num)
:if num <2:
return
false
elif num ==2:
return
true
else
:for i in
range(2
, num)
:if num % i ==0:
return
false
return
true
# 裝飾這段**也就意味著func=prime_nums()
@diaplay_time
defprime_nums()
:for i in
range(2
,10000):
if is_prime(i)
:print
(i)prime_nums(
)
這樣您就學會了裝飾器的基礎操作了,但是我們需要引數應該怎麼辦?
import time
# func等同於我等一下要執行這個函式
defdiaplay_time
(func)
:# 該函式表示要執行哪些內容(如果裝飾的函式需要引數需要在函式內寫入引數)
def(
*args)
: t1 = time.time(
)# 這裡表示執行函式-->裝飾誰就執行誰 (這裡也需要將引數放進去)
result = func(
*args)
t2 = time.time(
)print
(t2 - t1)
# 如果裝飾的函式有返回值,那麼這裡也需要進行返回
return result
defis_prime
(num)
:if num <2:
return
false
elif num ==2:
return
true
else
:for i in
range(2
, num)
:if num % i ==0:
return
false
return
true
@diaplay_time
# 這裡需要傳入引數需要在上面進行一些定義
defcount_prime_nums
(max_num)
: count =
0for i in
range(2
, max_num)
:if is_prime(i)
: count +=
1return count
# 這裡寫入需要傳的引數 引數傳遞過程: 10000-->*args-->func(*args)-->count_prime_nums(max_num)
nums = count_prime_nums(
10000
)print
(nums)
這樣的操作也可以運用到django的驗證使用者是否登入的裝飾器(雖然上下文能解決,但是有的面試官還是要問)
這個就不做過多的解釋了
defcheck_login
(func)
:# 自定義登入驗證裝飾器
defwarpper
(request,
*args,
**kwargs)
: is_login = request.session.get(
'is_login'
,false
)if is_login:
func(request,
*args,
**kwargs)
else
:return redirect(
"/login"
)return warpper
為什麼很多人賺不到錢?
做事死板,循規蹈矩 做事兒總是按照自己的想法,而不是按照趨勢做事,注定努力的得不到效果。關鍵是,他們安於現狀,安于現有的收入與工作。只知節流,不懂開源 老實人大多都是 松鼠思維 喜歡囤貨。喜歡攢錢而不是投資。投資才能擁有更多收益,學會正確的投資,才是正解。思想保守,不敢冒險 夏蟲不可語冰,井蛙不可語...
為什麼很多人會覺得IT門檻低?
剛過完年,公司來了乙個女生,歲數大概在26左右 敲開我的辦公室門,說自己是來求職的 不是網約面試者,自己上門找來的 我 你是應聘哪個崗位的?她 我應聘軟體開發。我 你學的是哪門語言?她 我就是應聘軟體開發的。我 你應聘的是哪門語言的開發?她 我就是應聘軟體開發的。我 我知道你應聘軟體開發了,但是你會...
為什麼很多人會有「年齡焦慮」?
大部分人的年齡焦慮來自於 沒能獲得自己認為的這個年齡應當有的成就,比如認知 錢 容貌 技能 愛好等等。換句話說,你的優勢不足以抵擋年齡增長帶來的暴擊。這幾年很多人給我的感覺就是,人生巔峰停留在了高考或藝考。因為大多人總是重複著 想當年 好懷念那時 我以前很瘦很美 等等。因為從那個節點開始,很多人找不...