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)
文章介绍了Python中装饰器的三种使用方式:1)直接调用函数;2)返回包装函数,需要手动调用;3)带参数的装饰器,展示了如何在装饰器中传递参数并影响被装饰的函数。这些例子主要用于测量和打印函数的执行时间。
41

被折叠的 条评论
为什么被折叠?



