关于装饰器的用法整理
关于装饰器的一些基本的用法,请点击底部的链接学习!
请设计一个decorator,它可作用于任何函数上,并打印该函数的执行时间:
import functools
import time
def metric(fn):
@functools.wraps(fn) #把原始函数的__name__等属性复制到wrapper()函数中
def wrapper(*args, **kw):
start = time.time() # 单位为 s
res = fn(*args, **kw)
time.sleep(0.001)
end = time.time()
t = (end - start) * 1000
print('%s executed in %.2f ms' % (fn.__name__, t))
return res
return wrapper
@metric
def now():
print("2021-6-6")
now()
请编写一个decorator,能在函数调用的前后打印出’begin call’和’end call’的日志。
import functools
def log(str):
def decorator(fn):
@functools.wraps(fn)
def wrapper(*args, **kw):
if callable(str):
print('begin call %s():' % fn.__name__)
res = fn(*args, **kw)
print('end call %s():' % fn.__name__)
return res
else:
print('%s begin call %s():' % (str, fn.__name__))
res = fn(*args, **kw)
print('%s end call %s():' % (str, fn.__name__))
return res
return wrapper
if callable(str):
return decorator(str)
return decorator
@log
def now():
print("2021-6-6")
now()
@log("execute")
def now():
print("2021-6-6")
now()
既支持@log(),又支持@log(‘execute’):
import functools
def log(str):
def decorator(fn):
@functools.wraps(fn)
def wrapper(*args, **kw):
if callable(str):
print('call %s():' % fn.__name__)
return fn(*args, **kw)
else:
print('%s %s():' % (str, fn.__name__))
return fn(*args, **kw)
return wrapper
if callable(str):
return decorator(str)
return decorator
@log
def now():
print("2021-6-5")
now()
@log("execute")
def now():
print("2021-6-5")
now()