1、普通用法
import time
def timer(fun):
start = time.time()
fun()
end = time.time()
print(f'function:{fun.__name__},duration:', end=f'{end - start}\n')
@timer
def a():
pass
@timer
def b():
time.sleep(3)
pass
装饰器timer中直接调用了fun(),所以上述代码直接运行即可
等同于
import time
def timer(fun):
start = time.time()
fun()
end = time.time()
print(f'function:{fun.__name__},duration:', end=f'{end - start}\n')
def a():
pass
timer(a)
2、返回函数
import time
def timer(fun):
def wrapper(*args, **kwargs):
start = time.time()
fun()
end = time.time()
print(f'function:{fun.__name__},duration:', end=f'{end - start}\n')
return wrapper
@timer
def a():
pass
@timer
def b():
time.sleep(3)
pass
a()
b()
import time
def timer(fun):
def wrapper(*args, **kwargs):
start = time.time()
fun(*args)
end = time.time()
print(f'function:{fun.__name__},duration:', end=f'{end - start}\n')
return wrapper
@timer
def a(*args):
print(args)
pass
@timer
def b(*args):
print(args)
time.sleep(3)
pass
a(1)
b(2)
装饰器返回了一个函数,所以需要手工调用
上述代码等同于
import time
def timer(fun):
def wrapper(*args, **kwargs):
start = time.time()
fun(*args)
end = time.time()
print(f'function:{fun.__name__},duration:', end=f'{end - start}\n')
return wrapper
def a(*args):
print(args)
pass
c = timer(a)
# c是返回的wrapper方法
c('1', '2')
# 当a()被装饰器装饰时,主动调用a()时,其实已经被替换为装饰器返回的方法
3、有参数装饰器
import time
def timer(level):
def decorator(fun):
def wrapper(*args, **kwargs):
start = time.time()
fun(level)
end = time.time()
print(f'function:{fun.__name__},duration:', end=f'{end - start}\n')
return wrapper
return decorator
@timer('1')
def a(*args):
print(args)
pass
@timer('2')
def b(*args):
print(args)
time.sleep(3)
pass
a()
b()
import time
def timer(level):
def decorator(fun):
def wrapper(*args, **kwargs):
return fun(level, *args, **kwargs)
return wrapper
return decorator
@timer('level')
def a(*args):
print(args)
pass
@timer('level')
def b(*args):
print(args)
time.sleep(3)
pass
a(1, 2, 3, 4, {"a": 1})
b(2, 3, 4, 5)