第二十九節,裝飾器

2021-09-08 18:56:32 字數 4781 閱讀 8293

裝飾器簡介

裝飾器,用於裝飾某個函式,或者方法,或者類

裝飾可以用於某個函式或者方法或者類在執行之前或者執行後做某些操作,也可以理解為,為某個函式或者方法或者類新增功能

好處:是不用改變原來的函式,就可以給原來的函式新增功能

方法:

1,定義乙個函式,裡面傳乙個值用於接收被裝飾函式的名稱(叫做裝飾器函式)

2,在裝飾器函式裡定義乙個函式(叫做裝飾器功能函式)來寫新增功能和執行被裝飾函式

3,在裝飾器功能函式return返回被裝飾函式給裝飾器功能函式,並且在裝飾器函式return返回裝飾器功能函式給裝飾器函式

4,在被裝飾函式上面寫上 @裝飾器函式名 就可以呼叫執行裝飾器函式

重點:只要函式應用上了裝飾器,那麼函式就會被重新定義,重新定義為裝飾器的內層函式,裝飾器內層函式的返回結果就等於應用了裝飾器的函式結果

#

!/usr/bin/env python

#-*- coding:utf-8 -*-

#裝飾器函式

defzh(sh): #接收被裝飾函式的名稱

def zhshi(): #

裝飾器功能函式

print("

在執行被裝飾函式前新增功能")

r = sh() #

執行裝飾器函式接收到的被裝飾函式,也就是執行被裝飾函式

print("

在執行被裝飾函式後新增功能")

return r #

將被裝飾函式執行的結果返回給裝飾器功能函式

return zhshi #

將裝飾器功能函式名稱返回給裝飾器函式

@zh

#@zh 的意思是執行裝飾器函式,並且將被裝飾的函式名,當做引數傳給裝飾器函式,並且將裝飾器函式的返回值重新賦值給被裝飾的函式

#被裝飾函式

deff1():

print("

f1被裝飾函式功能")

#執行f1函式

f1()

#在執行被裝飾函式前新增功能

#f1被裝飾函式功能

#在執行被裝飾函式後新增功能

重點:只要函式應用上了裝飾器,那麼函式就會被重新定義,重新定義為裝飾器的內層函式,裝飾器內層函式的返回結果就等於應用了裝飾器的函式結果

裝飾器裝飾含兩個引數的函式,就是原始的函式有兩個形式引數

#

!/usr/bin/env python

#-*- coding:utf-8 -*-

#裝飾器函式

def zh(sh): #

定義裝飾器函式,接收被裝飾函式的名稱

def zhshi(a1,a2): #

定義裝飾器功能函式,接收被裝飾函式的形式引數,注意這裡的形式引數可以不給被裝飾函式的形式引數一樣,但個數要一樣

print("

在執行被裝飾函式前新增功能")

r = sh(a1,a2) #

接收被裝飾函式的形式引數並且執行被裝飾函式

print("

在執行被裝飾函式後新增功能")

return r #

將被裝飾函式返回結果給,裝飾器功能函式

return zhshi #

將裝飾器功能函式名稱返回給,裝飾器函式

@zh

#呼叫執行裝飾器

#被裝飾函式

deff1(a1,a2):

a3 = a1 +a2

returna3#

執行f1函式

s1 = f1(3,5)

print

(s1)

#最後列印結果

#在執行被裝飾函式前新增功能

#在執行被裝飾函式後新增功能

重點:只要函式應用上了裝飾器,那麼函式就會被重新定義,重新定義為裝飾器的內層函式,裝飾器內層函式的返回結果就等於應用了裝飾器的函式結果

裝飾器裝飾含n個引數和任意引數的函式(推薦)

用(動態引數)乙個*元組型別非約束引數名稱 *args 和(動態引數)兩個**字典型別非約束引數名稱 **kwargs ,來實現裝飾器裝飾任意引數的函式(詳情見自定義函式動態引數)

動態引數)乙個*元組型別*args:可以接受多個單一性的實際引數

動態引數)兩個**字典型別非約束引數名稱**kwargs:可以接受多個鍵值性引數

以上結合就可以接受任意引數

#

!/usr/bin/env python

#-*- coding:utf-8 -*-

#裝飾器函式

def zh(sh): #

定義裝飾器函式,接收被裝飾函式的名稱

def zhshi(*args,**kwargs): #

定義裝飾器功能函式,用*args,**kwargs動態引數,接收被裝飾函式的形式引數

print("

在執行被裝飾函式前新增功能")

r = sh(*args,**kwargs) #

用*args,**kwargs動態引數,接收被裝飾函式的形式引數並且執行被裝飾函式

print("

在執行被裝飾函式後新增功能")

return r #

將被裝飾函式返回結果給,裝飾器功能函式

return zhshi #

將裝飾器功能函式名稱返回給,裝飾器函式

@zh

#呼叫執行裝飾器

#被裝飾函式

deff1(a1,a2,a3):

a4 = a1 +a2

print

(a4)

returna3#

執行f1函式

s1 = f1(3,5,"

林貴秀"

)print

(s1)

#在執行被裝飾函式前新增功能#8

#在執行被裝飾函式後新增功能

#林貴秀

裝飾器之多個裝飾器裝飾同乙個函式(重點)

裝飾器之多個裝飾器裝飾同乙個函式,是從被裝飾函式最近的乙個裝飾器呼叫開始的,依次從下到上的將裝飾器內層函式賦值疊加給上乙個裝飾器,等到達最上層呼叫裝飾器時在一步一步向疊加的函式裡面解析,將最後結果返回給最上層呼叫裝飾器在返回給被裝飾函式

#

!/usr/bin/env python

#-*- coding:utf-8 -*-

#裝飾器之多個裝飾器裝飾同乙個函式,注意注釋說明的步驟

#裝飾器函式1

def zh(sh): #

第一步將zh裝飾器函式放入記憶體,第五步執行zh裝飾器函式

def zhshi(*args,**kwargs):

print("

在執行被裝飾函式前新增功能

") #

列印字串

r = sh(*args,**kwargs) #

注意此時的sh函式就是zh2裝飾器函式的內層函式zhshi2,也就是執行的zhshi2()函式

print("

在執行被裝飾函式後新增功能

") #

列印字串

return r #

返回zhshi2函式的返回值

return

zhshi

#裝飾器函式2

def zh2(sh): #

第二步將zh2裝飾器函式放入記憶體,第四步將zh2裝飾器函式名和它的引數傳入zh裝飾器函式

def zhshi2(*args,**kwargs):

print("

額外增加")

r = sh(*args,**kwargs)

return

r

return

zhshi2

@zh@zh2

#第三步執行zh2裝飾器函式並且把f1函式名和它的引數傳入zh2裝飾器函式

deff1(a1,a2,a3):

a4 = a1 +a2

print

(a4)

returna3#

執行f1函式

s1 = f1(3,5,"

林貴秀"

)print

(s1)

#列印出

#在執行被裝飾函式前新增功能

#額外增加#8

#在執行被裝飾函式後新增功能

#林貴秀

第二十九節,裝飾器

第二十九節,裝飾器 裝飾器簡介 裝飾器,用於裝飾某個函式,或者方法,或者類 裝飾可以用於某個函式或者方法或者類在執行之前或者執行後做某些操作,也可以理解為,為某個函式或者方法或者類新增功能 好處 是不用改變原來的函式,就可以給原來的函式新增功能 方法 1,定義乙個函式,裡面傳乙個值用於接收被裝飾函式...

第二十九天

字元陣列和字元指標不是一回事 1字元陣列由若干個元素組成,每個元素中放乙個字元,而字元指標變數中存放的是位址 字串第乙個字元的位址 決不是將字串放到字元指標變數中。2賦值方法不同,對字元陣列只能對各個元素賦值,不能用以下辦法對字元陣列賦值。char str 20 str miao 字元指標變數,可以...

學習筆記第二十九節 動態Dp

因為noip2018考了這乙個東西,所以不得不學。我們以這一題為例題來引入今天的學習 模板 動態dp 我們顯然可以用樹形dp去做,倒不如我們先把方程列出來。這兩條公式挺顯然的吧。假設我們現在無聊,往樹鏈剖分的角度去考慮。那麼我們設乙個陣列g,表示的是從非重兒子轉移來的狀態,跟f陣列的轉移方程類似。我...