裝飾器的作用就是用乙個新函式封裝舊函式(是舊函式**不變的情況程式設計客棧下增加功能)然後會返回乙個新函式,新函式就叫做裝飾器,一般為了簡化裝飾器會用語法糖@新函式來簡化
例子:這是一段**,但功能太少,要對這個進行增強,但又不能改變**。
def hello():
return "hello world!"
現在我們的需求是要增強hello()函式的程式設計客棧功能,希望給返回加上html標籤,比如hello world,但要求我們不得改變hello()函式原來的定義。
def makeitalic(fun):#makitalic傳了乙個新函式
def wrapped():#內部函式
return ""+fun()+""#要程式設計客棧加的新功能
return wrapped#返回的是wrapped函式功能
def hello():#對這個功能進行增強
return "hello world!"
#makeitalic裡面傳入了hello函式,然後內部函式fun()函式也就相當於hello函式了
hello_2=makeita程式設計客棧lic(hello)
#列印新函式,返回的就是hello world!
print(hello_2())
為了增強原函式hello的功能,定義了乙個函式,它接收原函式作為引數,並返回乙個新的函式,在這個返回的函式中,執行了原函式,並對原函式的功能進行了增強。
事實上,makeitalic就是乙個裝飾器(decorator),它封裝了原函式hello,並返回了乙個新函式,用於增強原函式的功能,並將其賦值給hello。
一般情況下,我們使用裝飾器提供的@語法糖(syntactic sugar),來簡化上面的操作。
####使用@語法糖
def makeitalic(fun):
def wrapped():
return "" + fun() + ""
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裝飾器的好處就是在不用更改原函式的 前提下給函式增加新的功能。就是裝飾器的作用,首先介紹下裝飾器 裝飾器就是,假如已經有了乙個函式func a,b 作用是返回a b,但是現在要讓它返回a b的絕對值,就要增加乙個功能,...
python 中 裝飾器 的作用 與 理解
首先要知道 這個符號 裝飾器,就是個語法糖,主要的作用就是 安全 使用python裝飾器的好處就是在不用更改原函式的 前提下給函式增加新的功能。就是裝飾器的作用,首先介紹下裝飾器 裝飾器就是,假如已經有了乙個函式func a,b 作用是返回a b,但是現在要讓它返回a b的絕對值,就要增加乙個功能,...
python中裝飾器的作用
裝飾器的概念與意義 裝飾器是python特有的一大特色,要學習併入門python,裝飾器是一道不得不跨越的坎。裝飾器本質上是乙個python函式,它可以讓其他函式在不需要做任何 變動的前提下增加額外功能,裝飾器的返回值也是乙個函式物件。定義乙個閉包,再定義乙個變數來承接內部位址不然沒法呼叫。def ...