漸進式解讀python裝飾器 精

2022-05-01 14:24:10 字數 3502 閱讀 3228

a. python裝飾器解釋

:python裝飾器就是用於拓展原來函式功能的一種函式,使用python裝飾器的好處就是在不用更改原函式的**前提下給函式增加新的功能。

(可能:原函式已經上線了,不好修改**)

b.定義乙個新函式

,引數是 「函式名」,在新函式中呼叫老函式並加新功能。此新函式就是裝飾器。

如下:老函式有「看電視」的功能, 想增加 「看電視」 的功能

1

import

time

2def

old():

3 time.sleep(1)

4print("

寫作業")5

6def new(old): #

定義引數名(為了清楚我用的old)

7 old() #

引數名()

8print("

寫完作業就可以看電視")

9 new(old) #

old這個函式名 就是乙個變數,所有可以這麼用

c. 雖然沒有改變old 函式的**,但是是呼叫的new函式,需要調old函式,於是有了下面的調整:

定義新函式時也 定義乙個巢狀的函式,呼叫老函式在巢狀函式之下,新功能也寫在巢狀函式之中,新函式 return 巢狀函式名。(函式名實際上就是變數,所有它可以做函式的返回值)

那麼,呼叫新函式 就會返回個巢狀函式名,再用老函式名來 = 此巢狀函式名 (函式名是變數)

最後 呼叫老函式名 即是 呼叫新函式名

(老函式名()等於巢狀函式名())

1

import

time

2def

old():

3 time.sleep(1)

4print("

寫作業")5

6def

new(old):

7def

inner():

8old()

9print("

寫完作業就可以看電視")

10return inner #

新函式 返回巢狀函式名(函式名就是變數)

11 old = new(old) #

把 函式名 inner 賦值給 老函式名

12 old()

這樣老函式,就實現了呼叫老函式方法和新功能,且不改變老函式**

d.使用,其實大部分的」新函式「(裝飾器)已經是寫好了的,我門需要在定義」老函式「(需要被增加功能的函式)的時候,@新函式 ,使用更方便,就可以實現把下方的老函式 增加新功能

@新函式名 就相當於 寫了一句 老函式名=新函式名(老函式名)

1

def new(func): #

新函式(裝飾器)

2def

inner():

3func()

4print("

寫完作業就可以看電視")

5return

inner

67 @new #

給old函式裡增加new裝飾器的新功能

8def

old():

9print("

看電視")10

11#old = new(old) # @new 的效果就是這句話

12 old()

擴充套件:a.(定義帶參裝飾器)

若老函式帶引數,定義新函式時的 巢狀函式 也寫上引數,巢狀函式下呼叫老函式時使用這個引數。

1

def new(func): #

新函式(裝飾器)

2def

inner(thing):

3func(thing)

4print("

新增的功能")

5return

inner

67 @new #

給old函式裡增加new裝飾器的新功能

8def

old(something):

9print

(something)

1011 old("

看電視")

b.(裝飾器多層巢狀)

可以實現,先調」新函式「--再調」老函式「---再調「新函式」,如下:

1

import

time

2def

new2():

3def new1(func): #

此函式可以用來 寫一些前提條件的方法

4print("

穿上足力鍵")

5def inner(some): #

因為老函式有引數,inner函式需要定義引數

6func(some)

7print("

直接飛起來了

") #

跳了之後的後果

8return

inner

9return

new1

1011

@new2()

12def

old(something):

13 time.sleep(1)

14print

(something)

1516 old("

輕輕跳一下

")

c.(裝飾器帶引數的)

定義的裝飾器外層新函式帶引數的,在@new時,也要把引數寫入:@new(「引數」)

1

import

time

2def

new2(name):

3def new1(func): #

此函式可以用來 寫一些前提條件的方法

4print(name,"

穿上足力鍵")

5def inner(some): #

因為老函式有引數,inner函式需要定義引數

6func(some)

7print("

直接飛起來了

") #

跳了之後的後果

8return

inner

9return

new1

1011 @new2("

小陶") #

若 裝飾器帶了引數, @裝飾器時要寫入引數

12def

old(something):

13 time.sleep(1)

14print

(something)

1516 old("

輕輕跳一下

")

Python 裝飾器解讀

英文名 decorator def decorator obj print you used a decorator.return obj decorator deffunc pass decorator class clazz pass可以看到,裝飾器可以應用到函式和類上.在定義時,裝飾器表現為乙...

Python基礎《十九 函式式裝飾器》

由於函式也是乙個物件,而且函式物件可以被賦值給變數,所以,通過變數也能呼叫該函式。defnow print 2018 3 25 f now f 2018 3 25函式物件有乙個 name 屬性,可以拿到函式的名字 now.name now f.name now 現在,假設要增強now 函式的功能,比...

精析python中的裝飾器 生成器

裝飾器 在程式設計時,要遵循乙個原則,就是開放 封閉原則。在不破壞原函式的情況下,要想對原函式進行一些修飾,那麼這裡就要用到裝飾器。例如 你完成了一些用函式寫成的專案,此時公司正在年度考核,你需要給你寫的每乙個函式都加上乙個計算時間的功能,隨即考核完成後,又需要把函式恢復原狀,到了下一階段考核,可能...