裝飾器本質上就是乙個python函式,他可以讓其他函式在不需要做任何**變動的前提下,增加額外的功能,裝飾器的返回值也是乙個函式物件。
裝飾器的作用:在不改變原函式及原函式的執行的情況下,為原函式增加一些額外的功能,比如列印日誌、執行時間,登入認證等等。
乙個簡單的裝飾器:
import time
def func1():
print('晚上回家吃飯!')
time.sleep(1)
def func2():
print("晚上不回家吃飯!")
time.sleep(1)
def timer(f1):
star_time = time.time()
f1()
end_time = time.time()
print('耗時:%s'%(end_time-star_time))
f = func1
func1 = timer
func1(f)
import time
def func1():
print('晚上回家吃飯!')
time.sleep(1)
def func2():
print("晚上不回家吃飯!")
time.sleep(1)
def timer(f1): # f1 = func1
def inner():
star_time = time.time()
f1()
end_time = time.time()
print('耗時:%s'%(end_time-star_time))
return inner
func1 = timer(func1) #實際返回inner
func1() #相當於執行inner()
但是如果有多個函式,我都想讓你測試他們的執行時間,你每次是不是都得func1 = timer(func1)?這樣還是有點麻煩,
因為這些函式的函式名可能是不相同,有func1,func2,graph,等等,所以更簡單的方法,python給你提供了,那就是語法糖。
import time
def timer(f1):
def inner():
star_time = time.time()
f1()
end_time = time.time()
print('耗時:%s'%(end_time-star_time))
return inner
@timer #相當於 func1 = timer(func1) 返回inner
def func1():
print('晚上回家吃飯!')
time.sleep(1)
func1()
帶引數的裝飾器:
import time
def timer(f1): #f1 = func1
def inner(*args,**kwargs):
star_time = time.time()
f1(*args,**kwargs)
end_time = time.time()
print('耗時:%s'%(end_time-star_time))
return inner
@timer #相當於 func1 = timer(func1) 返回inner
def func1(a,b):
print(a,b)
print('晚上回家吃das 飯!')
time.sleep(1)
func1(11,22) #相當於執行inner(11,22)
帶返回值的裝飾器
import time
def timer(f1):
def inner(*args,**kwargs):
star_time = time.time()
'''上面的**是執行函式之前的操作'''
ret = f1(*args,**kwargs)
'''下面的部分是執行函式之後的操作'''
end_time = time.time()
print('耗時:%s'%(end_time-star_time))
return ret
return inner
@timer #相當於 func1 = timer(func1) 返回inner
def func1(a,b):
print(a,b)
print('晚上回家吃das 飯!')
time.sleep(1)
return 666
print(func1(11,22)) #相當於執行inner(11,22)
執行結果
11 22
晚上回家吃das 飯!
耗時:1.0000572204589844
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 函式的...
python裝飾器原理 Python裝飾器原理
裝飾器 decorator 是物件導向設計模式的一種,這種模式的核心思想是在不改變原來核心業務邏輯 的情況下,對函式或類物件進行額外的修飾。python中的裝飾器由python直譯器直接支援,其定義形式如下 decorator def core service 要理解上述 的含義,我們從自定義函式裝...