基本例子
import functools
import time
#装饰器用法
def myDecorator(func):
def wrapper(*args,**kwargs):#wrapper是装饰器的关键词
start_time=time.time()
print(f'{func.__name__} is runing')
result=func(*args,**kwargs)
over_time=time.time()
print(f"{func.__name__} have run {over_time-start_time}")
return result
return wrapper
@myDecorator
def mySquare(x):
return x*x
mySquare(99.76) #相当于 my_decorator=myDecorator(mySquare)
# my_decorator(99.76)
mySquare(1)
print('______________________________________')
结果:
mySquare is runing
mySquare have run 0.0
mySquare is runing
mySquare have run 0.0
装饰器生成器用法
def timer(threshold):
def myDecorator(func):
def wrapper(*args,**kwargs):
start_time=time.time()
print(f'{func.__name__} is runing')
result=func(*args,**kwargs)
over_time=time.time()
consume_time=over_time-start_time
if consume_time>=threshold:
print(f"{func.__name__} have run overly {over_time-start_time}")
else:
print(f"{func.__name__} have run normally {over_time - start_time}")
return result
return wrapper
return myDecorator
@timer(0.8)
def sleep_4():
time.sleep(0.4)
sleep_4() #相当于sleep_4()=timer(0.8)(sleep_4)
print(sleep_4.__name__) #返回wrapper
结果:
sleep_4 is runing
sleep_4 have run normally 0.41031980514526367
wrapper
装饰器生成器的进一步改进
def timer(threshold):
def myDecorator(func):
@functools.wraps(func)
def wrapper(*args,**kwargs):
start_time=time.time()
print(f'{func.__name__} is runing')
result=func(*args,**kwargs)
over_time=time.time()
consume_time=over_time-start_time
if consume_time>=threshold:
print(f"{func.__name__} have run overly {over_time-start_time}")
else:
print(f"{func.__name__} have run normally {over_time - start_time}")
return result
return wrapper
return myDecorator
@timer(0.8)
def sleep_4():
time.sleep(0.4)
sleep_4() #相当于sleep_4()=timer(0.8)(sleep_4)
print(sleep_4.__name__) #返回sleep_4
结果:
sleep_4 is runing
sleep_4 have run normally 0.40468764305114746
sleep_4