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)