函式(四) 裝飾器

2022-09-18 07:33:28 字數 3802 閱讀 8633

裝飾器是可呼叫的物件,其引數是另乙個函式(被裝飾的函式)。裝飾器可能會處理被裝飾的函式,然後把它返回,或者將其替換成另乙個函式或可呼叫物件。

如果有乙個名為decorate的裝飾器(如下**),

def

decorate(func):

def

print('')

start_time =time.perf_counter()

func()

end_time =time.perf_counter()

print(f'

函式的執行時間為:')

print('')

則:def

for_loop():

print('

for_loop函式開始執行')

for i in range(1000):

pass

print('

for_loop 函式結束')

new_for = decorate(for_loop) #

new_for()

等價於:

@decorate

deffor_loop():

print('

for_loop函式開始執行')

for i in range(1000):

pass

print('

for_loop 函式結束')

for_loop()

上述兩種寫法結果一樣,函式執行完之後得到的for_loop不一定是原來那個for_loop()函式,而是decorate(for_loop)返回的函式。

為了確認被裝飾的函式會被替換,請看上邊以下示例的控制台會話。

import

time

defdecorate(func):

def

print('')

start_time =time.perf_counter()

func()

end_time =time.perf_counter()

print(f'

函式的執行時間為:')

print('')

@decorate

#使用decorate裝飾for_loop

deffor_loop():

print('

for_loop函式開始執行')

for i in range(100000):

pass

print('

for_loop 函式結束')

for_loop()

#"""

執行結果:

for_loop函式開始執行

for_loop 函式結束

函式的執行時間為:0.002172199999999999

"""print(for_loop) #

#

嚴格來說,裝飾器只是語法糖。如前所示,裝飾器可以像常規的可呼叫物件那樣呼叫,其引數是另乙個函式。

綜上,裝飾器的兩大特性

1. 能把被裝飾的函式替換成其他函式。

2. 裝飾器在載入模組時立即執行。

如果被修飾的函式帶有引數,則裝飾器中應該也放入乙個引數, 且這個引數應該作為裡層函式的引數進行傳遞。因為裝飾器函式最終返回的是裝飾器中的函式物件, 等價於被裝飾的函式。

import

time

defdecorate(func):

def

print('')

start_time =time.perf_counter()

func(number)

end_time =time.perf_counter()

print(f'

函式的執行時間為:')

print('')

@decorate

#使用decorate裝飾for_loop

deffor_loop(number):

print('

for_loop函式開始執行')

for i in

range(number):

pass

print('

for_loop 函式結束')

for_loop(100000) #

"""執行結果:

for_loop函式開始執行

for_loop 函式結束

函式的執行時間為:0.002172199999999999

"""

import

time

defdecorate(func):

start_time =time.perf_counter()

func(*args)

end_time =time.perf_counter()

print(f'

函式的執行時間為:')

@decorate

def welcome(*args):

name, age =args

if age >= 18:

print(f'

hello , 你已成年')

else

:

print(f'

hello , 你未成年')

welcome(

'elsa

', 19)

"""執行結果:

hello elsa, 你已成年

函式的執行時間為:2.1300000000001873e-05

"""

import

time

defdecorate(func):

start_time =time.perf_counter()

func(*args, **kwargs)

end_time =time.perf_counter()

print(f'

函式的執行時間為:')

@decorate

def info(*args, **kwargs):

name, gender =args

print(f"

姓名:\n性別:\n愛好:")

info(

'elsa

', 19, hobby = '桌球')

"""執行結果:

姓名:elsa

性別:19

愛好:桌球

函式的執行時間為:2.3700000000001498e-05

"""執行結果:

running decorate1

running decorate2

hello

"""

python函式四(裝飾器高階)

一。開放封閉原則 1.對擴充套件是開放的 任何乙個程式,不可能在設計之初就已經想好了所有的功能並且未來不做任何更新和修改。所以我們必須允許 擴充套件 新增新功能。2.對修改是封閉的 比如我們寫的乙個函式,很有可能已經交付給其他人使用了,如果這個時候我們對其進行了修改,很有可能影響其他已經在使用該函式...

函式裝飾器 類裝飾器

一 函式裝飾函式 defwrapfun func definner a,b print function name func.name r func a,b return r return inner wrapfun defmyadd a,b return a b print myadd 2,3 二...

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

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