#要求设计一个装饰器打印函数的执行的时间 #使用返回函数,但是我现在对返回函数还是有点朦朦胧胧的 #看了别人的代码,才勉勉强强的写出来 #这里的关键是使函数在装饰器中执行一次,然后再返回这个函数 #之前对在返回函数中能不能执行函数比较模糊 import functools,time def metric(fn): def wrapper(*args, **kw): ts = time.time() f2 = fn(*args, **kw)#f2保存执行结果 print('%s executed in %s ms' % (fn.__name__, time.time() - ts )) return f2 return wrapper #在函数调用前输出begin call,调用结束输出end call #返回的函数只有被调用时才会执行 def log(func): def wrapper(*args,**kw): print('begin call %s'%func.__name__) f = func(*args,**kw)#f保存执行结果 print('end call %s'%func.__name__) return f return wrapper # 测试 @metric 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('测试失败!') else: print('测试成功') #定义一个装饰器,既支持log,又支持log(text) def log(text): if isinstance(text, str): def decorator(func): def wrapper(*args, **kw): print('%s %s():' % (text, func.__name__)) return func(*args, **kw) return wrapper return decorator else: def wrapper(*args,**kw): return text(*args,**kw) return wrapper @log # hello = log(hello) def hello1(): print('hello world 1') @log('test') def hello2(): print('hello world 2') hello1() hello2()