裝飾器是什麼東西?為什麼很多人乙個月還學不會?

2021-10-03 20:25:10 字數 3270 閱讀 1919

您是否有這樣的煩惱?

研究很長時間裝飾器了但是還不明白裝飾器是什麼東西?

明明上次感覺有點眉目了,但是感覺沒內味。

今天希望通過這篇文章能讓您知道裝飾器到底是什麼?

裝飾器能幹什麼?

裝飾器模式(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左右 敲開我的辦公室門,說自己是來求職的 不是網約面試者,自己上門找來的 我 你是應聘哪個崗位的?她 我應聘軟體開發。我 你學的是哪門語言?她 我就是應聘軟體開發的。我 你應聘的是哪門語言的開發?她 我就是應聘軟體開發的。我 我知道你應聘軟體開發了,但是你會...

為什麼很多人會有「年齡焦慮」?

大部分人的年齡焦慮來自於 沒能獲得自己認為的這個年齡應當有的成就,比如認知 錢 容貌 技能 愛好等等。換句話說,你的優勢不足以抵擋年齡增長帶來的暴擊。這幾年很多人給我的感覺就是,人生巔峰停留在了高考或藝考。因為大多人總是重複著 想當年 好懷念那時 我以前很瘦很美 等等。因為從那個節點開始,很多人找不...