例1:普通装饰器
def timer(func):
def wrapper():
start = time.time()
func()
end = time.time()
print(end-start)
# 保留四位有效数字
print('total time:{:.4}'.format(end-start))
return wrapper
@timer
def step1():
count = 0
for i in range(1000000):
count+=1
@timer
def step2():
count = 0
for i in range(12000000):
count+=1
# step1()
# step2()
例2:函数带参数
def timer2(func):
def wrapper(*args):
start = time.time()
func(*args)
end = time.time()
print(end-start)
# 保留四位有效数字
print('total time:{:.4}'.format(end-start))
return wrapper
@timer2
def step11(num):
count = 0
for i in range(num):
count+=1
@timer2
def step21(num):
count = 0
for i in range(num):
count+=1
# step11(10000000)
# step21(1200000)
例3:带返回值
def timer3(func):
def wrapper(*args):
start = time.time()
value = func(*args)
end = time.time()
print(end-start)
# 保留四位有效数字
print('total time:{:.4}'.format(end-start))
return value
return wrapper
@timer3
def step13(num):
count = 0
for i in range(num):
count+=1
return count
@timer3
def step23(num):
count = 0
for i in range(num):
count+=1
return count
# step13(10000000)
# step23(1200000)
例4:打印日志(实际应用)
# 打印日志,生产中用 的最多
def debug(func):
def wrapper(*args, **kwargs):
print(f'{func.__name__}:{args},{kwargs}')
ret_val = func(*args, **kwargs)
print(f'return :{ret_val}')
return ret_val
return wrapper
@debug
def add(a,b):
return a+b
# add(2,5)
例5:让函数变慢()
# 让函数运行变慢
def slow(func):
def wrapper(*args, **kwargs):
time.sleep(1)
ret_value = func(*args, **kwargs)
return ret_value
return wrapper
@slow
def add2(a, b):
return a+b
# add2(2,5)
例6:装饰器带参数
要在普通装饰器外面在套上一层
# 装饰器参数
# 要在普通装饰器外面在套上一层
def slow2(seconds):
def decorator_slow(func):
def wrapper(*args, **kwargs):
print(f'sleep:{seconds} seconds')
time.sleep(seconds)
ret_value = func(*args, **kwargs)
return ret_value
return wrapper
return decorator_slow
@slow2(1)
def add3(a,b):
return a+b
# add3(2,6)
例7: 类装饰器,单例模式
# 类装饰器,单例模式
def single(cls):
def single_wrapper(*args, **kwargs):
if not single_wrapper.instance:
single_wrapper.instance = cls(*args, **kwargs)
return single_wrapper.instance
single_wrapper.instance = None
return single_wrapper
class V():
def __init__(self) -> None:
self.count = 0
def v(self):
self.count+=1
print(f'the {self.count} times visit')
c = V()
c.v()
c.v()
例8:带状态的装饰器,
记录第几次调用
# 带状态的装饰器,装饰器记录第几次调用
def count(func):
def wrapper(*args, **kwargs):
wrapper.count+=1
print(f'第{wrapper.count}次调用')
func()
wrapper.count = 0
return wrapper
@count
def run():
pass
run()
run()