理解python中裝飾器的作用
裝飾器的作用就是用一個新函數封裝舊函數(是舊函數代碼不變的情況下增加功能)然後會返回一個新函數,新函數就叫做裝飾器,一般為瞭簡化裝飾器會用語法糖@新函數來簡化
例子:
這是一段代碼,但功能太少,要對這個進行增強,但又不能改變代碼。
def hello(): return "hello world!"
現在我們的需求是要增強hello()函數的功能,希望給返回加上HTML標簽,比如<i>hello world</i>,但要求我們不得改變hello()函數原來的定義。
def makeitalic(fun):#makitalic傳瞭一個新函數 def wrapped():#內部函數 return "<i>"+fun()+"</i>"#要加的新功能 return wrapped#返回的是wrapped函數功能 def hello():#對這個功能進行增強 return "hello world!" #makeitalic裡面傳入瞭hello函數,然後內部函數fun()函數也就相當於hello函數瞭 hello_2=makeitalic(hello) #打印新函數,返回的就是<i>hello world!</i> print(hello_2())
為瞭增強原函數hello的功能,定義瞭一個函數,它接收原函數作為參數,並返回一個新的函數,在這個返回的函數中,執行瞭原函數,並對原函數的功能進行瞭增強。
事實上,makeitalic就是一個裝飾器(decorator),它封裝瞭原函數hello,並返回瞭一個新函數,用於增強原函數的功能,並將其賦值給hello。
一般情況下,我們使用裝飾器提供的@語法糖(Syntactic Sugar),來簡化上面的操作。
####使用@語法糖 def makeitalic(fun): def wrapped(): return "<i>" + fun() + "</i>" return wrapped @makeitalic#使用瞭裝飾器可以直接調用,不需要賦值瞭 def hello(): return "hello world" print(hello())#使用瞭裝飾器可以直接調用,不需要賦值瞭
像上面的情況,可以動態的修改函數(或類的)功能的函數就是裝飾器。本質上,它是一個高階函數,以被裝飾的函數(比如上面的hello)為參數,並返回一個包裝後的函數(比如上面的wrapped)給被修飾函數(hello)。
當調用hello()函數時,hello函數的執行流程如下分析:
1.把hello函數作為參數傳給@符號後面的裝飾器函數。
2.然後開始執行裝飾器函數,並返回一個包裝瞭的函數,同時,改變原函數的指向,現在原函數指向瞭這個包裝函數。
3.執行原函數,其實此時執行的是包裝瞭的函數,所以說,裝飾器增強瞭一個現有函數的功能,但不會改變現有函數的定義。
普通裝飾器的使用形式:
@decorator def fun(): pass #格式就如同下面的: def fun(): pass fun = decorator(fun)#不使用語法糖要進行賦值
裝飾器可以定義多個,離函數定義最近的裝飾器最先被調用,比如:
@decotator_one @decorator_two def fun(): pass #格式如同下面的: def fun(): pass fun = decorator_one(decorator_two(fun))
裝飾器還可以帶參數,比如:
@decorator(arg1, arg2) def fun(): pass #格式如同下面的: def fun(): pass fun = decorator(arg1, arg2)(fun)
到此這篇關於python中裝飾器的作用的文章就介紹到這瞭,更多相關python裝飾器作用內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Python語法詳解之decorator裝飾器
- Python各種類型裝飾器詳細介紹
- 一文詳解如何創建自己的Python裝飾器
- Python 面向切面編程 AOP 及裝飾器
- python 裝飾器重要在哪