python之裝飾器

2021-10-03 16:01:15 字數 3531 閱讀 4560

裝飾器是一種在程式開發中經常使用到的功能,是在**執行期間動態增加功能的方式。本質上,裝飾器就是乙個返回函式的高階函式,當你學會裝飾器後呢,python開發簡直如虎添翼!!!

1、那麼我們先來理解下函式物件與函式名稱概念:在python中,函式時第一類物件,是指可以用識別符號(函式名)來命令,且可以被當做資料處理的物件。當定義乙個函式時,函式的本身是物件。

無論是把函式賦值給新的識別符號,還是作為引數傳遞給新的函式,針對的都是函式物件本身,而不是函式的呼叫。

#定義函式fun_xt

deffun_xt()

:print

('i am xt...'

)#定義mfun(函式),引數為乙個函式

defmfun

(func)

: func(

)#呼叫mfun,fun_xt函式的函式名作為引數傳遞

mfun(fun_xt)

#執行結果

i am xt...

#以上**呢,可以理解為函式mfun呼叫fun_xt函式

#我們再來看下面一段**

deffun_xt()

:#定義fun_xt函式

defmfun()

:#定義內部函式mfun()

print

('i am xt...'

)return mfun

fun_xt(

)#我們這樣呼叫函式呢,顯示的結果返回值為mfun()函式

#也就是 .mfun at 0x00000250b1ca01f0>

#應該這樣呼叫

fun_xt()(

)#顯示結果

i am xt.

..

在上述**中,fun_xt內部定義的函式mfun作為乙個變數返回,然後呼叫fun_xt函式獲取返回值,最後繼續呼叫返回的函式mfun列印出結果。

我們可以知道:函式本身可以看做乙個物件,且函式物件可以被賦值給變數,所以通過變數也能呼叫該函式

2、裝飾器的運用方式

首先要注意以下三點:

裝飾器是一種增加函式功能的簡單方法,它可以給不同的函式插入相同的功能。

裝飾器的表示語法使用特殊符號「@」來實現。

裝飾器的定義與普通函式的定義完全一致,但裝飾器函式的引數必須有函式或物件。

先寫一段**感受下

#假設xt公司有三個部門,w部門,f1部門,f2部門。負責寫**程式,而f1和f2

#只負責呼叫。就好比你打遊戲,你只需要玩,而裝備技能由遊戲內部程式生成。

#w部門為f1,f2設計程式如下

deff1()

:print

('正在呼叫f1……'

)deff2(

):print

('正在呼叫f2……'

)#f1部門呼叫函式時

f1()

#f2部門呼叫函式時

f2()

'''是不是有點簡單?那麼問題來了如果f2部門越權呼叫f1呢?怎麼解決這個問題?

所以w部門根據需求來修改**,為他們增加許可權,那麼來重構程式'''

#w部門重構後的程式

defw1

(func)

:#定義inner函式,用於查詢許可權

definner()

:print

('正在調查許可權……'

) func(

)return inner

deff1()

:print

('正在呼叫f1……'

)deff2(

):print

('正在呼叫f2……'

)#當f1部門呼叫時

f1 = w1(f1)

f1()

#同理,f2部門的呼叫同樣如此,別慌,裝飾器馬上來了,我們先來剖析下這段**

'''簡單說,當程式執行到f1 = w1(f1)時python到w1函式去執行,而形參func指

向f1,也就是函式f1()的位址傳給了func,程式繼續向下執行,return返回inner

函式。相當於f1 = inner 此時的f1指向inner位址.當執行f1()時,就等於執行了

inner()'''

#執行結果為

正在調查許可權……

正在呼叫f1……

有點蒙?我這解釋確實不生動,抱歉,文筆不行。別怕,我還有!!!有點簡陋哈

了解了上面後,我們開始使用主角裝飾器。也叫語法糖哦!

def

w1(func)

:def

inner()

: a =

int(

input

('請輸入驗證碼:'))

print

('---調查許可權中---'

)if a ==1:

print

('驗證成功!'

) func(

)else

:print

('驗證失敗!'

)return inner

#裝飾器,等價於f1 = w1(f1)

@w1

deff1()

:print

('正在呼叫f1……'

)f1(

)#執行結果

請輸入驗證碼:1--

-調查許可權中---

驗證成功!

正在呼叫f1……

ps:再新增一點,裝飾器是乙個從下往上裝的過程,當呼叫時,**已經裝飾完了,開始從上往下呼叫!

def

w1(func)

:print

('裝飾器執行時間'

)def

inner()

: a =

int(

input

('請輸入驗證碼:'))

print

('---調查許可權中---'

)if a ==1:

print

('驗證成功!'

) func(

)else

:print

('驗證失敗!'

)return inner

#裝飾器,等價於f1 = w1(f1)

@w1#裝飾器開始裝飾,並不是呼叫f1後才裝飾

deff1()

:print

('正在呼叫f1……'

)#注意,這裡我們沒有呼叫函式,去執行下試試

#執行結果

裝飾器執行時間

#通過這段**我們知道,當直譯器從上到下解釋的時候,函式w1和f1並不會執行

#,而到@w1時,直譯器會自動執行,也就是f1 = w1(f1),自動從下往上裝飾。

#在呼叫f1之前,已經進行裝飾了,而f1()只是執行裝飾完後從上往下執行

python裝飾器介紹 Python之裝飾器簡介

python函式式程式設計之裝飾器 1.開放封閉原則 簡單來說,就是對擴充套件開放,對修改封閉。在物件導向的程式設計方式中,經常會定義各種函式。乙個函式的使用分為定義階段和使用階段,乙個函式定義完成以後,可能會在很多位置被呼叫。這意味著如果函式的定義階段 被修改,受到影響的地方就會有很多,此時很容易...

python 找到裝飾器 Python之裝飾器

裝飾器本質上就是乙個python函式,他可以讓其他函式在不需要做任何 變動的前提下,增加額外的功能,裝飾器的返回值也是乙個函式物件。裝飾器的作用 在不改變原函式及原函式的執行的情況下,為原函式增加一些額外的功能,比如列印日誌 執行時間,登入認證等等。乙個簡單的裝飾器 import time def ...

Python之裝飾器

裝飾器就是乙個以函式作為引數並返回乙個替換函式的可執行函式 即裝飾器是乙個函式,其引數為函式,返回值也為函式 可理解為對函式的功能進行拓展,所以叫裝飾 outer為裝飾器,效果為給被裝飾函式返回值結果加負號 defouter fun definner x return fun x return in...