python 函式 裝飾器

2022-06-05 11:06:07 字數 4181 閱讀 5587

裝飾器模式,重點在於裝飾,裝飾的核心仍是被裝飾的物件。

舉乙個栗子:我今天穿了一件短袖,但是突然一陣風,短袖沒辦法為我禦寒,我想到的辦法是將短袖變得更厚更長,但是改造之後,它就不是一件真正的短袖了。

於是有了長袖的誕生,將長袖套在短袖外面,既可擋風又可禦寒,媽媽再也不用擔心我感冒了。短袖是短袖,長袖是長袖,相互獨立。

裝飾器就像我們的長袖,在不影響短袖改造的情況下,達到了擋風禦寒的效果。

裝飾器的應用場景:插入日誌、效能測試、事務處理、快取等。

def

short_t():

## 定義乙個基礎函式

print("

穿了一件短袖")

short_t()

import

time

deflong_t(func):

## 定義乙個測試函式執行時間的函式(裝飾函式)

definner():

start_time =time.time()

short_t

poor = time.time() -start_time

print("

函式的執行時間為:%d s

"%poor)

return

inner

defshort_t():

print("

穿了一件短袖")

short_t = long_t(short_t()) #

# *****>裝飾器實質:裝飾函式的引數是被裝飾函式的物件()

short_t()

執行順序:1、python直譯器開始執行後,引入time模組;

2、先讀函式long_t,再讀函式short_t(將函式名放在記憶體,但不執行);

3、執行呼叫者等號右邊long_t(short_t),執行long_t函式,並將引數short_t傳入函式;

4、讀函式inner,將inner函式的返回值inner賦值給呼叫者short_t(則short = inner),執行inner()函式(則short_t = inner());

5、計算開始時間,(傳入引數為:short_t,則func() = short_t()),執行short_t函式,列印「穿了一件函式」;

6、計算函式結束與開始時間的差值,並列印差值,函式執行完畢。

使用語法糖(@被裝飾函式)來代替

short_t = long_t(short_t()

'''

import

time

deflong_t(func):

## 定義乙個測試函式執行時間的函式

definner():

start_time =time.time()

func()

poor = time.time() -start_time

print("

函式的執行時間為:%d s

"%poor)

return

inner

@long_t

defshort_t():

## 定義乙個基礎函式

print("

穿了一件短袖")

short_t()

import

time

deflong_t(func):

## 定義乙個測試函式執行時間的函式

def inner(*args,**kwargs): ## 新增萬能引數

start_time =time.time()

func(*args,**kwargs) ## 新增萬能引數

poor = time.time() -start_time

print("

函式的執行時間為:%d s

"%poor)

return

inner

@long_t

defshort_t(a,b): ## 無論傳多少引數,裝飾器都能接收

## 定義乙個基礎函式

print("

%s和%s穿了一件短袖

"%(a,b))

short_t("小白

","小黑

")

import

time

deflong_t(func):

## 定義乙個測試函式執行時間的函式

def inner(*args,**kwargs):

start_time =time.time()

ret = func(*args,**kwargs) ## 接收返回的值

poor = time.time() -start_time

print("

函式的執行時間為:%d s

"%poor)

return

ret                  ## 返回接收的值給接收者

return

inner

@long_t

defshort_t(a,b):

## 定義乙個基礎函式

return("

%s和%s穿了一件短袖

"%(a,b))

print(short_t("

小白","

小黑"))            ## 列印返回的值

def

def inner(*args,**kwargs):

## 執行函式前操作

ret = func(*args,**kwargs)

## 執行函式後操作

return

ret

return inner

1、對擴充套件是開放的:任何乙個程式,做到完美,總是經過不斷的迭代來公升級更新,所有我們必須允許**擴充套件,新增新功能;

2、對修改的封閉的:其一,開發寫的函式,有交付給其他人去使用,如果進行修改,很可能影響其他正在使用函式的使用者;

其二,在原有功能上修改函式,很有可能牽一髮而動全身,引發其他部分的bug。

裝飾器遵循了開放封閉原則

1) 獲取裝飾器函式的函式名和注釋資訊:

def

def inner(*args,**kwargs):

'''執行函式前操作

'''ret = func(*args,**kwargs)

'''執行函式後操作

'''return

ret

return

inner

deff1():

'''注釋資訊

'''print(f1.__name__

) ## 獲取函式名

print(f1.__doc__

) ## 獲取函式注釋資訊

f1() # ==== inner()

執行結果:

inner

執行函式前操作

2)獲取被裝飾器函式的函式名和注釋資訊:

from functools import

wraps         ## 引入模組

def@wraps(func)               ## 放在最內層函式正上方def inner(*args,**kwargs):

'''執行前操作

'''ret = func(*args,**kwargs)

'''執行後操作

'''return

ret

return

inner

defname():

'''注釋資訊

'''print(name.__name__

)

print(name.__doc__

)name()

執行結果:

name

注釋資訊

python裝飾器 函式裝飾器,類裝飾器

只要實現此 模式,這個obj就叫乙個裝飾器 參考 函式裝飾器 例子 def decorator func def inner args,kwargs print before.res func args,kwargs print after.return res return inner decor...

python 裝飾器 函式裝飾器 類裝飾器

python函式裝飾器和類裝飾器筆記.usr bin env python coding utf 8 author ivan file decorators.py version from functools import wraps 裝飾器 目的是為了給函式新增附加功能 1.不帶引數裝飾器 此方式...

python裝飾器 裝飾器工廠函式

使用裝飾器實現如下所示的列印 小白聯盟def printequel func1 def inner1 print 15 func1 return inner1 def printstar func2 def inner2 print 15 func2 return inner2 printequel...