使用裝飾器時帶括號與不帶括號的區別

2022-05-23 04:15:09 字數 2411 閱讀 3465

之前我們在乙個用於統計函式呼叫消耗時間的裝飾器中寫了乙個裝飾器,用於統計函式呼叫時間。**如下:

from time import

time

from time import

sleep

defcount_time():

deftmp(func):

begin_time =time()

result = func(*args, **kargs)

end_time =time()

cost_time = end_time -begin_time

print

'%s called cost time : %s

' %(func.__name__

, cost_time)

return

result

return

return tmp

對於該裝飾器,我們必須這樣使用:

@count_time()

deftest():

sleep(0.5)

if__name__ == '

__main__':

test()

這裡注意,裝飾器後面加了括號。

如果我們不加括號:

@count_time

deftest():

sleep(0.5)

if__name__ == '

__main__':

test()

就會產生錯誤:

traceback (most recent call last):

file

"16.py

", line 16, in

@count_time

typeerror: count_time() takes no arguments (1 given)

但是很多裝飾器使用時,是不必加括號的,那麼這是怎麼回事?

我們將上面的裝飾器進行改寫:

from time import

time

from time import

sleep

import

sysdef

count_time(func):

begin_time =time()

result = func(*args, **kargs)

end_time =time()

cost_time = end_time -begin_time

print

'%s called cost time : %s ms

' %(func.__name__, float(cost_time)*1000)

return

result

此時,就不需要加括號了。

這二者的區別在於,第乙個存在括號,允許使用者傳入自定義資訊,所以需要額外包裝一層,不加括號的版本則不需要。

所以當我們需要自定義裝飾器內的某些message時,就需要採用加括號的方式。

對於這個統計時間的裝飾器,我們可以這樣自定義資訊:

#coding: utf-8

from time import

time

from time import

sleep

defcount_time(msg):

deftmp(func):

begin_time =time()

result = func(*args, **kargs)

end_time =time()

cost_time = end_time -begin_time

print

'msg: %s ,%s called cost time : %s

' %(msg, func.__name__

, cost_time)

return

result

return

return tmp

然後這樣使用:

@count_time("

foobar")

deftest():

sleep(0.5)

@count_time(

"測試訊息")

deftest2():

sleep(0.7)

if__name__ == '

__main__':

test()

test2()

結果如下:

msg: foobar ,test called cost time : 0.501540899277msg: 測試訊息 ,test2 called cost time : 0.701622009277

後面綜合前面幾篇,寫乙個完整的裝飾器教程。

Python中類 帶括號與不帶括號的區別

有時候看到群裡一些人問一些基礎的知識,雖然很基礎,網上隨便一查即可知道,但是往往很多人就是連這些基礎的知識都很模糊,甚至不清楚,這裡再來複習一下python中類的乙個知識點 僅此 用來描述具有相同的屬性和方法的物件的集合。它定義了該集合中每個物件所共有的屬性和方法。物件是類的例項。舉個生活栗子,乙個...

js函式呼叫帶括號和不帶括號的區別

1.帶括號 只要是呼叫函式進行執行的,都帶括號。返回的結果是返回值或者執行結果。當然,有些沒有返回值,但已經執行了函式體內的行為,就是說,加括號的,就代表將會執行函式體 function sayhello alert 豬年大吉 console.log sayhello 2.不帶括號 不加括號的,都是...

JS函式中帶與不帶括號的區別

js函式中帶與不帶括號的區別 其實總結起來如下 函式只要是要呼叫它進行執行的,都必須加括號。此時,函式 實際上等於函式的返回值。當然,有些沒有返回值,但已經執行了函式體內的行為,這個是根本,就是說,只要加括號的,就代表將會執行函式體 不加括號的,都是把函式名稱作為函式的指標,用於傳參,此時不是得到函...