中文字幕第五页-中文字幕第页-中文字幕韩国-中文字幕最新-国产尤物二区三区在线观看-国产尤物福利视频一区二区

Python裝飾器的使用方法是什么

本篇內(nèi)容主要講解“Python裝飾器的使用方法是什么”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“Python裝飾器的使用方法是什么”吧!

成都創(chuàng)新互聯(lián)公司專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè)、澤州網(wǎng)絡(luò)推廣、小程序定制開發(fā)、澤州網(wǎng)絡(luò)營(yíng)銷、澤州企業(yè)策劃、澤州品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);成都創(chuàng)新互聯(lián)公司為所有大學(xué)生創(chuàng)業(yè)者提供澤州建站搭建服務(wù),24小時(shí)服務(wù)熱線:028-86922220,官方網(wǎng)址:www.2m8n56k.cn

1. 什么是裝飾器

對(duì)于受到封裝的原函數(shù)比如f來(lái)說(shuō),裝飾器能夠在f函數(shù)執(zhí)行前或者執(zhí)行后分別運(yùn)行一些代碼。

2. 裝飾器的結(jié)構(gòu)

裝飾器也是一個(gè)函數(shù),它裝飾原函數(shù)f或類cls后,再返回一個(gè)函數(shù)g

裝飾一個(gè)函數(shù):

def decorator(f):   # 定義要返回的函數(shù)   def g():     print('函數(shù)f執(zhí)行前的動(dòng)作')     f()     print('函數(shù)f執(zhí)行后的動(dòng)作')   return g

裝飾一個(gè)類:

def decorator(cls):   # 定義要返回的函數(shù)   def g():     print('類cls執(zhí)行前的動(dòng)作')     f()     print('類cls執(zhí)行后的動(dòng)作')   return g

使用裝飾器很簡(jiǎn)單,@+自定義裝飾器 裝飾要想裝飾的函數(shù)。

3. 為什么要這樣

要想理解裝飾器為什么要有這種結(jié)構(gòu),要首先想明白裝飾器的目標(biāo)是什么。

它的價(jià)值在于為原函數(shù)f增加一些行為,前提必須不能破壞函數(shù)f,所以肯定不能改變f的內(nèi)部結(jié)構(gòu),所以只能在調(diào)用f前后定義一些行為。

同時(shí),裝飾器函數(shù)decorator返回值又是什么?你可以思考下,返回一個(gè)函數(shù)是再好不過(guò)的了,它包裝了原函數(shù)f.

4. 裝飾一個(gè)函數(shù)

printStar函數(shù)接收一個(gè)函數(shù)f,返回值也是一個(gè)函數(shù),所以滿足裝飾器的結(jié)構(gòu)要求,所以printStar是一個(gè)裝飾器。

def printStar(f):     def g():         print('*'*20)         f()         print('*'*20)     return g

printStar裝飾器實(shí)現(xiàn)f函數(shù)執(zhí)行前、后各打印20個(gè)*字符。

使用printStar:

@printStar def f():     print('hello world')

調(diào)用:

if __name__ == '__main__':    ### 改變函數(shù)功能    f()

打印結(jié)果:

******************** hello world ********************

可以很方便的裝飾要想裝飾的其他函數(shù),如下:

@printStar def g():     print('welcome to Python')

5. 裝飾一個(gè)類

除了可以裝飾函數(shù)f外,還可以裝飾類cls,兩者原理都是一樣的。

下面給出一個(gè)裝飾器實(shí)現(xiàn)單例模式的例子,所謂單例就是類只有唯一實(shí)例,不能有第二個(gè)。

def singleton(cls):    instance = {}     def get_instance(*args, **kwargs):        if cls not in instance:            instance[cls] = cls(*args, **kwargs)        return instance[cls]    return get_instance

定義字典instance,鍵值對(duì)分別為類和實(shí)例,這樣確保只cls()一次。

使用裝飾器singleton修飾類:

@singleton class CorePoint:    pass

測(cè)試:

if __name__ == '__main__':    ### 改變類的功能    c1 = CorePoint()    c2 = CorePoint()    print(c1 is c2) # True

6. 裝飾器層疊

上面原函數(shù)f不僅能被一個(gè)裝飾器修飾,還能被n多個(gè)裝飾器修飾。

下面再定義一個(gè)裝飾器printLine,被修飾函數(shù)執(zhí)行前后打印20個(gè):

def printLine(f):     def g():         print('-'*20)         f()         print('-'*20)     return g

使用上文定義好的printStar和printLine同時(shí)裝飾函數(shù)f:

@printStar @printLine def f():     print('hello world')

此時(shí)再調(diào)用函數(shù)f:

if __name__ == '__main__':    ### 改變函數(shù)功能    f()

打印結(jié)果:

******************** -------------------- hello world -------------------- ********************

f被裝飾后,先打印*,再打印 -

層疊多一層,原函數(shù)f就變強(qiáng)大一層。使用裝飾器,還能實(shí)現(xiàn)功能抽離,進(jìn)一步實(shí)現(xiàn)松耦合。

7. 溫馨提醒

打印原函數(shù)f的名字__name__,結(jié)果為f

In [1]: def f():     ...:     pass   In [4]: f.__name__                                                               Out[4]: 'f'

但是,被裝飾后函數(shù)名字f變?yōu)間,這不是我們希望的!

@printStar def f():   pass  f() f.__name__ # g

Python提供的解決方案:使用functools模塊中的wraps裝飾器:

from functools import wraps  def printStar(f):     @wraps(f)     def g():         print('*'*20)         f()         print('*'*20)     return g

此時(shí)再打印被裝飾后f的名字,顯示f,正常!

到此,相信大家對(duì)“Python裝飾器的使用方法是什么”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

網(wǎng)頁(yè)名稱:Python裝飾器的使用方法是什么
分享地址:http://www.2m8n56k.cn/article5/pjecoi.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信小程序響應(yīng)式網(wǎng)站面包屑導(dǎo)航網(wǎng)站策劃做網(wǎng)站網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:[email protected]。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)
主站蜘蛛池模板: 免费观看欧美一级特黄 | 亚洲精品一区二区三区www | 国产a级精品特黄毛片 | 欧美性色xo影院在线观看 | 一区二区视屏 | a毛片在线看片免费 | 2级毛片 | 精品国产一区二区三区国产馆 | 免费观看成人久久网免费观看 | 97超级碰碰碰碰在线视频 | 亚洲国产二区三区久久 | 久久精品vr中文字幕 | 欧美成人h精品网站 | 91一区二区视频 | 国产午夜爽爽窝窝在线观看 | 欧美成人怡红院在线观看 | 91精品国产91久久久久久 | 亚洲成人手机在线观看 | 成人久久久久久 | 伊人爱爱网 | 免费人成综合在线视频 | 日韩国产在线播放 | 免费一级a毛片免费观看欧美大片 | 亚洲性网站| 精品亚洲综合久久中文字幕 | 国产成人精品免费久久久久 | 日韩国产在线观看 | 国产欧美在线观看 | 加勒比毛片 | 日韩精品一区二区在线观看 | 久久国产精品无码网站 | 亚洲一区二区三区四区五区六区 | 欧美一区二区三区免费不卡 | 美女脱了内裤张开腿让男人桶网站 | 亚洲视频免费看 | 日韩成人免费在线 | 国产成人精品曰本亚洲77美色 | 韩国免费毛片 | 亚洲精品一级一区二区三区 | 色综合天天综合网看在线影院 | 亚洲天堂2015 |