內(nèi)置語法糖 格式優(yōu)美 逼格較高
成都創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都做網(wǎng)站、成都網(wǎng)站設(shè)計、天峻網(wǎng)絡(luò)推廣、小程序設(shè)計、天峻網(wǎng)絡(luò)營銷、天峻企業(yè)策劃、天峻品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎;成都創(chuàng)新互聯(lián)為所有大學(xué)生創(chuàng)業(yè)者提供天峻建站搭建服務(wù),24小時服務(wù)熱線:028-86922220,官方網(wǎng)址:vcdvsql.cn
在代碼中使用洽到好處的裝飾器瞬間讓代碼優(yōu)美很多
寫起來也很簡單 無參的裝飾器參數(shù)是要裝飾的函數(shù) 有參裝飾器參數(shù)是需要的參數(shù) 最后返回的是內(nèi)部函數(shù)!
裝飾器是通過裝飾器函數(shù)修改原函數(shù)的一些功能而不需要修改原函數(shù),在很多場景可以用到它,比如① 執(zhí)行某個測試用例之前,判斷是否需要登錄或者執(zhí)行某些特定操作;② 統(tǒng)計某個函數(shù)的執(zhí)行時間;③ 判斷輸入合法性等。合理使用裝飾器可以極大地提高程序的可讀性以及運(yùn)行效率。本文將介紹Python裝飾器的使用方法。
python裝飾器可以定義如下:
輸出:
python解釋器將test_decorator函數(shù)作為參數(shù)傳遞給my_decorator函數(shù),并指向了內(nèi)部函數(shù) wrapper(),內(nèi)部函數(shù) wrapper() 又會調(diào)用原函數(shù) test_decorator(),所以decorator()的執(zhí)行會先打印'this is wrapper',然后打印'hello world', test_decorator()執(zhí)行完成后,打印 'bye' ,*args和**kwargs,表示接受任意數(shù)量和類型的參數(shù)。
裝飾器 my_decorator() 把真正需要執(zhí)行的函數(shù) test_decorator() 包裹在其中,并且改變了它的行為,但是原函數(shù) test_decorator() 不變。
一般使用如下形式使用裝飾器:
@my_decorator就相當(dāng)于 decorator = my_decorator(test_decorator) 語句。
內(nèi)置裝飾器@functools.wrap可用于保留原函數(shù)的元信息(將原函數(shù)的元信息,拷貝到對應(yīng)的裝飾器函數(shù)里)。先來看看沒有使用functools的情況:
輸出:
從上面的輸出可以看出test_decorator() 函數(shù)被裝飾以后元信息被wrapper() 函數(shù)取代了,可以使用@functools.wrap裝飾器保留原函數(shù)的元信息:
輸出:
裝飾器可以接受自定義參數(shù)。比如定義一個參數(shù)來設(shè)置裝飾器內(nèi)部函數(shù)的執(zhí)行次數(shù):
輸出:
Python 支持多個裝飾器嵌套:
裝飾的過程:
順序從里到外:
test_decorator('hello world') 執(zhí)行順序和裝飾的過程相反。
輸出:
類也可以作為裝飾器,類裝飾器主要依賴__call__()方法,是python中所有能被調(diào)用的對象具有的內(nèi)置方法(python魔術(shù)方法),每當(dāng)調(diào)用一個類的實例時,__call__()就會被執(zhí)行一次。
下面的類裝飾器實現(xiàn)統(tǒng)計函數(shù)執(zhí)行次數(shù):
輸出:
下面介紹兩種裝飾器使用場景
統(tǒng)計函數(shù)執(zhí)行所花費(fèi)的時間
輸出:
在使用某些web服務(wù)時,需要先判斷用戶是否登錄,如果沒有登錄就跳轉(zhuǎn)到登錄頁面或者提示用戶登錄:
--THE END--
裝飾器是從英文decorator翻譯過來的,從字面上來看就是對某個東西進(jìn)行修飾,增強(qiáng)被修飾物的功能,下面我們對裝飾器做下簡單介紹。
一、怎么編寫裝飾器
裝飾器的實現(xiàn)很簡單,本質(zhì)是一個可調(diào)用對象,可以是函數(shù)、方法、對象等,它既可以裝飾函數(shù)也可以裝飾類和方法,為了簡單說明問題,我們實現(xiàn)一個函數(shù)裝飾器,如下代碼:
有了這個裝飾器,我們就可以打印出什么時候開始和結(jié)束調(diào)用函數(shù),對于排查函數(shù)的調(diào)用鏈非常方便。
二、帶參數(shù)的裝飾器
上面的例子無論什么時候調(diào)用sum都會輸出信息,如果我們需要按需輸出信息怎么實現(xiàn)呢,這時就要用到帶參數(shù)的裝飾器了,如下代碼:
對sum使用裝飾器時沒有參數(shù),這時debug為0,所以調(diào)用sum時不會輸出函數(shù)調(diào)用相關(guān)信息。
對multi使用裝飾器時有參數(shù),這時debug為1,所以調(diào)用multi時會輸出函數(shù)調(diào)用相關(guān)信息。
三、函數(shù)名字問題
當(dāng)我們打印被裝飾后的函數(shù)名字時,不知道大家有沒發(fā)現(xiàn)輸出的不是函數(shù)本身的名字,如下代碼會輸出‘wrap’而不是‘sum’:
有時這種表現(xiàn)并不是我們想要的,我們希望被裝飾后的函數(shù)名字還是函數(shù)本身,那要怎么實現(xiàn)呢?很簡單,只需要引入functools.wraps即可,如下代碼就會輸出‘sum’了:
看完后是不是覺得python裝飾器很簡單,只要了解它的本質(zhì),怎么寫都行,有好多種玩法呢。
本文標(biāo)題:python中裝飾函數(shù)的簡單介紹
文章起源:http://vcdvsql.cn/article40/dsiipeo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供營銷型網(wǎng)站建設(shè)、微信小程序、網(wǎng)站內(nèi)鏈、網(wǎng)站策劃、云服務(wù)器、網(wǎng)站導(dǎo)航
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)