对于装饰器Decorator的理解
装饰器是用来描述函数,记录日志,提供信息的函数,是一个为了更好的服务主函数的副函数:
详情还需查看:廖雪峰装饰器
关键在于:【import functools
是导入functools
模块。模块的概念稍候讲解。现在,只需记住在定义wrapper()
的前面加上@functools.wraps(func)
即可。】
下面是对两道对应练习题的个人代码编写即记录:
练习题1:请设计一个decorator,它可作用于任何函数上,并打印该函数的执行时间:(事件函数目前没掌握,但是不影响对装饰器的理解)
import time, functools
def metric(fn): # 这是decorator函数的定义,没有过多要传递的信息,两层嵌套嵌套即可
@functools.wraps(fn)
def wrapper(*args, **kw):
print('%s executed in %s ms' % (fn.__name__, '10.24'))
return fn(*args, **kw)
return wrapper
@metric #这是在定义主函数时调用decorator函数的方法
def fast(x, y):
time.sleep(0.0012)
return x + y
@metric
def slow(x, y, z):
time.sleep(0.1234)
return x * y * z
f = fast(11, 22)
s = slow(11, 22, 33)
if f != 33:
print('测试失败!')
elif s != 7986:
print('测试失败!')
练习题2:请编写一个decorator,能在函数调用的前后打印出'begin call'
和'end call'
的日志:
import functools
def metric(text1,text2): # 这里不允许写要服务的函数名
def decorate(fn): # 要服务的函数名这里写
@functools.wraps(fn)
def wrapper(*args, **kw):
print('%s %s:' % (text1, fn.__name__))
fn(*args, **kw)
print('%s %s.' % (text2, fn.__name__))
return wrapper
return decorate
@ metric('begin call','end call') # r如果在调用装饰器时要个性化传递参数,装饰器函数需要3层嵌套;注意这里不能再写good,已经@了。
def good(x,y):
print(x+y)
good(2,3)