裝飾器(decorator):
裝飾器的方便在於可以在不修改原**基礎上,新增其他功能。
例如,可以函式加乙個輸出函式執行時間的功能:
import math
import time
defdisplay_time
(func)
:#裝飾器也就是乙個函式
def(
*args)
:#再來乙個函式
t1 = time.time(
) res = func(
*args)
#引入func函式, 挺方便噠
t2 = time.time(
)print
("total time: s"
.format
(t2-t1)
)print
("total time: %.4f s %s king"
%(t2-t1,
'rng and rw'))
return res
defis_prime
(num)
:#判斷是不是素數
if num <2:
return
false
elif num <=3:
return
true
else
: tmp =
int(math.sqrt(num))+
1for i in
range(2
, tmp)
:if num % i ==0:
return
false
return
true
@display_time #裝飾器就是加一句這個**
defprime_num
(num)
: cnt =
0for i in
range(2
, num +1)
:if is_prime(i)
: cnt +=
1return cnt
cnt = prime_num(
100)
print
( cnt )
引數不定怎麼辦呢?
#帶有不定引數的裝飾器
import time
defdeco
(func)
:def
(*args,
**kwargs)
: starttime = time.time(
) func(
*args,
**kwargs)
endtime = time.time(
) msecs =
(endtime - starttime)
*1000
print
("time is %d ms"
%msecs)
@deco
deffunc
(a,b)
:print
("hello,here is a func for add :"
) time.sleep(1)
print
("result is %d"
%(a+b)
)@deco
deffunc2
(a,b,c)
:print
("hello,here is a func for add :"
) time.sleep(1)
print
("result is %d"
%(a+b+c)
)func(1,
2)func2(1,
2,3)
可以多用裝飾器嗎?
#多個裝飾器
import time
defdeco01
(func)
:def
(*args,
**kwargs)
:print
("this is deco01"
) starttime = time.time(
) func(
*args,
**kwargs)
endtime = time.time(
) msecs =
(endtime - starttime)
*1000
print
("time is %d ms"
%msecs)
print
("deco01 end here"
)def
deco02
(func)
:def
(*args,
**kwargs)
:print
("this is deco02"
) func(
*args,
**kwargs)
print
("deco02 end here"
)@deco01
@deco02
deffunc
(a,b)
:print
("hello,here is a func for add :"
) time.sleep(1)
print
("result is %d"
%(a+b)
)func(3,
4)'''this is deco01
this is deco02
hello,here is a func for add :
result is 7
deco02 end here
time is 1003 ms
deco01 end here
'''
Python基礎知識之裝飾器decorator
本質是函式,裝飾其他函式 為其他函式新增附加功能。不能修改被裝飾的函式的源 不能修改被裝飾的函式的呼叫方式 高階函式 巢狀函式 裝飾器 1.函式即 變數 定義乙個函式就相當於定義乙個變數,即將函式體賦值給乙個變數名。python的記憶體 機制規定 當儲存在記憶體中的內容沒有對應的變數名指定時,則當記...
python裝飾器 Python 裝飾器
簡言之,python裝飾器就是用於拓展原來函式功能的一種函式,這個函式的特殊之處在於它的返回值也是乙個函式,使用python裝飾器的好處就是在不用更改原函式的 前提下給函式增加新的功能。一般而言,我們要想拓展原來函式 最直接的辦法就是侵入 裡面修改,例如 這是我們最原始的的乙個函式,然後我們試圖記錄...
python裝飾器 裝飾器
由於函式也是乙個物件,而且函式物件可以被賦值給變數,所以,通過變數也能呼叫該函式。def now print 2015 3 25 f now f 2015 3 25 函式物件有乙個 name 屬性,可以拿到函式的名字 now.name now f.name now 現在,假設我們要增強now 函式的...