装饰器
# 一个函数装饰器的列子 def log(func): def wrapper(*args,**kwargs): print('Name=%s'%func.__name__) return func(*args,**kwargs) return wrapper @log def Print(): print('2017-2-3') return None Print() ''' 观察上面的log,因为它是一个decorator,所以接受一个函数作为参数,并返回一个函数。 通过@方法调用后,调用log输入Print为参数函数,在wrapper中修改,然后整合成为新的函数返回 '''
D:\untitled1\venv\Scripts\python.exe D:/untitled1/装饰器.py Name=Print 2017-2-3
常用装饰器模板
- 无参数的装饰器:【因为返回的那个
wrapper()
函数名字就是'wrapper'
,所以,需要把原始函数的__name__
等属性复制到wrapper()
函数中,否则,有些依赖函数签名的代码执行就会出错。】
import functools def log(func): @functools.wraps(func) def wrapper(*args, **kw): print('call %s():' % func.__name__) return func(*args, **kw) return wrapper
- 有参数的装饰器:【因为返回的那个
wrapper()
函数名字就是'wrapper'
,所以,需要把原始函数的__name__
等属性复制到wrapper()
函数中,否则,有些依赖函数签名的代码执行就会出错。】
import functools def log(text): def decorator(func): @functools.wraps(func) def wrapper(*args, **kw): print('%s %s():' % (text, func.__name__)) return func(*args, **kw) return wrapper return decorator
装饰器案例
# 一个装饰器计算函数执行时间 import time, functools def log(func): @functools.wraps(func) # 保证函数名一致的方法 def wrapper(*args, **kw): ''' 下面三个为装饰器装饰后的功能增加项 ''' oldTime = time.process_time() result = func(*args, **kw) newTime = time.process_time() print('函数 %s 运行时间为 %s ms' % (func.__name__ ,newTime - oldTime)) return result return wrapper @log def test(): for x in range(1, 10000000): x += 1 test()
友情链接: