装饰器有很多经典的使用场景,例如插入日志、性能测试、事务处理等等,有了装饰器,就可以提取大量函数中与本身功能无关的类似代码,从而达到代码重用的目的。
装饰器有两种写法:
1. 装饰器不传参数
2. 装饰器自带参数
第一种,装饰器不传参写法:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
def log1(func): @wraps(func) def wrapper(*args, **kw): print('%s():' % func.__name__) return func(*args, **kw) return wrapper # 第一种不带参数的装饰器调用 @log1 def fn1(): print('2017-06-16') print(fn1()) # 执行结果如下: # fn1(): # 2017-06-16
第二种,装饰器自带参数写法:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# 第二种,装饰器带参数写法: def log2(text): def decorator(func): def wrapper(*args, **kw): print('%s %s()' %(text, func.__name__)) return func(*args, **kw) return wrapper return decorator # 第二种带参数的装饰器调用 @log2('hkey') def fn2(): print('2017-06-16') print(fn2()) # 执行结果如下: # hkey fn2() # 2017-06-16
将两种装饰器合并起来的函数:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# Author:hkey def log(text): if hasattr(text, '__call__'): def wrapper(*arg, **kw): print('%s():' %text.__name__) return text(*arg, **kw) return wrapper else: def decorator(func): def wrapper(*args, **kw): print('%s():' %text) return func(*args, **kw) return wrapper return decorator @log def f(): print('2017-6-17') print(f())