您好,登錄后才能下訂單哦!
本文實例講述了Python自定義裝飾器原理與用法。分享給大家供大家參考,具體如下:
什么是裝飾器?裝飾器本質是一個函數,它可以在不改變原來的函數的基礎上額外的增加一些功能。如常見的@classmethod,@staticmethod等都是裝飾器,接下來記錄下如何自定義個裝飾器:
剛剛說過了,裝飾器的本質就是一個函數,所有想要自定義一個裝飾器,首先自定義一個函數
def decorate(func): def wrapper(*args,**kwargs): print("定義一個裝飾器") func(*args,**kwargs) return wrapper
此時就已經定義好了一個基本的裝飾器,那該如何調用呢?
@decorate def text1(): print("text1") text1()
輸出的結果為:
定義一個裝飾器
text1
分析:此時的@decorate
相當于將text1函數的內存地址傳入decorate函數,并返回wrapper函數的內存地址。因此在代碼結尾中調用text1()
本質上是執行wrapper函數。因為執行的是wrapper函數,所以會打印”定義一個裝飾器”,又因為func函數是text1的內存地址,所以調用func,會打印”text1”。
帶參數的裝飾器
上面介紹了一個簡單的裝飾器如何定義,可是我們常常看到一個裝飾器@xxxxxxx(abc="python")
,這種裝飾器是如何封裝的,原理又是怎么樣的呢
def decorate(name): def wrapper(func): def sub_wrapper(*args,**kwargs): print("定義一個帶參數的裝飾器",name) func(*args,**kwargs) return sub_wrapper return wrapper @decorate(name="python") def text1(): print("text1") text1()
輸出結果:
定義一個帶參數的裝飾器 python
text1
分析:帶參數的裝飾器與普通的裝飾器多加了一層,其實就是講“python”參數傳入decorate函數,并返回wrapper函數的內存地址,再將text1函數內存地址傳入wrapper函數,并返回了sub_wrapper函數的內存地址。而在代碼末尾調用text1,其實本質是調用了sub_wrapper函數。
更多關于Python相關內容感興趣的讀者可查看本站專題:《Python數據結構與算法教程》、《Python加密解密算法與技巧總結》、《Python編碼操作技巧總結》、《Python函數使用技巧總結》、《Python字符串操作技巧匯總》及《Python入門與進階經典教程》
希望本文所述對大家Python程序設計有所幫助。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。