裝飾器是一種在程式開發中經常使用到的功能,是在**執行期間動態增加功能的方式。本質上,裝飾器就是乙個返回函式的高階函式,當你學會裝飾器後呢,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...