理解python中裝飾器的作用

2022-09-25 09:12:11 字數 1945 閱讀 8783

裝飾器的作用就是用乙個新函式封裝舊函式(是舊函式**不變的情況程式設計客棧下增加功能)然後會返回乙個新函式,新函式就叫做裝飾器,一般為了簡化裝飾器會用語法糖@新函式來簡化

例子:這是一段**,但功能太少,要對這個進行增強,但又不能改變**。

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 ...