1.裝飾器的使用:
import time
def dec(func):
def wrapper():
start_time=time.time()
func()
end_time=time.time()
print('程序運行時間爲:',end_time-start_time)
return wrapper
@dec #等於func=dec(func)
def func():
print('hello')
time.sleep(1)
print('world')
func()
>>:
hello
world
程序運行時間爲: 1.0015339851379395
-----執行過程-----
1.定義dec(func)
2.@dec 等於執行func=dec(func)
2.1運行dec(func)內部
2.1.1定義wrapper()
2.2返回wrapper,此時func=wrapper
3.執行func() 此時fun()=wrapper()
4.執行wrapper()內部
4.1start_time=time.time()取得開始時間start_time
4.2執行func()
4.2.1執行func()內部
print('hello')
time.sleep(1)
print('world')
4.2.2end_time=time.time()取得結束時間end_time
4.2.3print('程序運行時間爲:',end_time-start_time)
2.帶多個參數的裝飾器
import time
def dec(func):
def wrapper(*args,**kwargs):
start_time=time.time()
func(*args,**kwargs)
end_time=time.time()
print('程序運行時間爲:',end_time-start_time)
return wrapper
@dec
def func1(a,b):
print('第一個參數爲%s'%a)
time.sleep(1)
print('第二個參數爲%s'%b)
@dec
def func2(a,b,c):
print('第一個參數爲%s' % a)
time.sleep(1)
print('第二個參數爲%s' % b)
time.sleep(1)
print('第三個參數爲%s' % c)
func1('a','b')
func2('a','b','c')
>>:
第一個參數爲a
第二個參數爲b
程序運行時間爲: 1.0039470195770264
第一個參數爲a
第二個參數爲b
第三個參數爲c
程序運行時間爲: 2.0091400146484375
3.多個裝飾器
import time
def dec1(func):
def wrapper(*args,**kwargs):
start_time=time.time()
print('第一個裝飾器開始')
func(*args,**kwargs)
end_time=time.time()
print('第一個裝飾器結束')
print('程序運行時間爲:',end_time-start_time)
return wrapper
def dec2(func):
def wrapper(*args,**kwargs):
start_time=time.time()
print('第二個裝飾器開始')
func(*args,**kwargs)
end_time=time.time()
print('第二個裝飾器結束')
print('程序運行時間爲:',end_time-start_time)
return wrapper
@dec1#func=dec1(func)
@dec2#func=dec2(func)
def func(a,b):
print('第一個參數爲%s'%a)
time.sleep(1)
print('第二個參數爲%s'%b)
func('a','b')
>>:
第一個裝飾器開始
第二個裝飾器開始
第一個參數爲a
第二個參數爲b
第二個裝飾器結束
程序運行時間爲: 1.0015060901641846
第一個裝飾器結束
程序運行時間爲: 1.0016918182373047
執行過程
1.定義第一個裝飾器dec1(func)
2.定義第二個裝飾器dec2(func)
3.執行@dec1 相當於func=dec1(func)
4.執行@dec2 相當於func=dec2(func)
5.執行dec2(func)內部
5.1執行wrapper(*args,**kwargs)
5.2返回wrapper,此時func=wrapper
6.執行dec1(func)內部
6.1執行wrapper(*args,**kwargs)
6.2返回wrapper,此時func=wrapper
7.執行func()相當於wrapper()(此時在裝飾器dec1內)
7.1執行start_time=time.time()
print('第一個裝飾器開始')
7.2執行func(*args,**kwargs),此時跳轉執行裝飾器dec2中的wrapper
7.2.1start_time=time.time()
print('第二個裝飾器開始')
7.2.2執行func(*args,**kwargs)
執行func(a,b):
print('第一個參數爲%s'%a)
time.sleep(1)
print('第二個參數爲%s'%b)
7.3 end_time=time.time()
print('第二個裝飾器結束')
print('程序運行時間爲:',end_time-start_time)
7.4 end_time=time.time()
print('第一個裝飾器結束')
print('程序運行時間爲:',end_time-start_time)