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

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

本篇內容主要講解“Python裝飾器的使用方法是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Python裝飾器的使用方法是什么”吧!

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

1. 什么是裝飾器

對于受到封裝的原函數比如f來說,裝飾器能夠在f函數執行前或者執行后分別運行一些代碼。

2. 裝飾器的結構

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

裝飾一個函數:

def decorator(f):   # 定義要返回的函數   def g():     print('函數f執行前的動作')     f()     print('函數f執行后的動作')   return g

裝飾一個類:

def decorator(cls):   # 定義要返回的函數   def g():     print('類cls執行前的動作')     f()     print('類cls執行后的動作')   return g

使用裝飾器很簡單,@+自定義裝飾器 裝飾要想裝飾的函數。

3. 為什么要這樣

要想理解裝飾器為什么要有這種結構,要首先想明白裝飾器的目標是什么。

它的價值在于為原函數f增加一些行為,前提必須不能破壞函數f,所以肯定不能改變f的內部結構,所以只能在調用f前后定義一些行為。

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

4. 裝飾一個函數

printStar函數接收一個函數f,返回值也是一個函數,所以滿足裝飾器的結構要求,所以printStar是一個裝飾器。

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

printStar裝飾器實現f函數執行前、后各打印20個*字符。

使用printStar:

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

調用:

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

打印結果:

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

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

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

5. 裝飾一個類

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

下面給出一個裝飾器實現單例模式的例子,所謂單例就是類只有唯一實例,不能有第二個。

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,鍵值對分別為類和實例,這樣確保只cls()一次。

使用裝飾器singleton修飾類:

@singleton class CorePoint:    pass

測試:

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

6. 裝飾器層疊

上面原函數f不僅能被一個裝飾器修飾,還能被n多個裝飾器修飾。

下面再定義一個裝飾器printLine,被修飾函數執行前后打印20個:

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

使用上文定義好的printStar和printLine同時裝飾函數f:

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

此時再調用函數f:

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

打印結果:

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

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

層疊多一層,原函數f就變強大一層。使用裝飾器,還能實現功能抽離,進一步實現松耦合。

7. 溫馨提醒

打印原函數f的名字__name__,結果為f

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

但是,被裝飾后函數名字f變為g,這不是我們希望的!

@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

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

到此,相信大家對“Python裝飾器的使用方法是什么”有了更深的了解,不妨來實際操作一番吧!這里是創新互聯網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

網頁名稱:Python裝飾器的使用方法是什么
分享地址:http://m.2m8n56k.cn/article5/pjecoi.html

成都網站建設公司_創新互聯,為您提供微信小程序響應式網站面包屑導航網站策劃做網站網站建設

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:[email protected]。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

h5響應式網站建設
主站蜘蛛池模板: 六月丁香婷婷色狠狠久久 | 9久久99久久久精品齐齐综合色圆 | 日本高清精品 | 日韩精品中文字幕在线观看 | 午夜爽爽爽 | 一区二区三区四区在线免费观看 | 特级黄色毛片视频 | 99精品国产在现线免费 | 波多野结衣在线播放 | 男人天堂社区 | 国产精品久久久久久久人热 | 在线观看日本免费视频大片一区 | 亚洲人成在线影院 | 免费看成人毛片 | 毛片在线高清免费观看 | 三级美国 | 欧美三级网 | 免费看特黄特黄欧美大片 | 欧美日韩精品一区二区另类 | 99视频网站 | 高清 国产 日韩 欧美 | 精品视频在线免费播放 | 亚洲国产美女视频 | 香港三级日本三级人妇三级四 | 久久精品免费在线观看 | 免费永久在线观看黄网 | 性欧美videofree中文字幕 | 成年免费观看 | a级成人高清毛片 | 亚洲国产高清人在线 | 久久久久久中文字幕 | a毛片在线播放 | 久久久免费观看视频 | se就是色94欧美setu | 久久久久久久久网站 | 日本一极毛片兔费看 | 成人性生免费视频 | 久久久久999 | a毛片免费观看完整 | 一区二区高清在线 | 精品色视频 |