前言: 本章节的最终目标是解释清楚函数装饰器的工作原理,包括最简单的注册装饰器和较复杂的参数化装饰器。
目录:
内容回顾相关资料阅读后感正文: 一. 内容回顾 1.1 装饰器基础知识 装饰器的一大特性是能把被装饰的函数替换成其他函数,第二个特性是装饰器在加载模块时立即执行。
1.2 Python何时执行装饰器 主要讲解了装饰器的第二个特性,装饰器在加载模块时立即执行。
1.3 使用装饰器改进“策略”模式
1.4 变量作用域规则 变量分为局部变量和全局变量,这里提到了自由变量,讲解下面的闭包做铺垫。
1.5 闭包
# -*- coding:utf-8 -*- def make_averager(): series = [] def averager(new_value): series.append(new_value) total = sum(series) return total/len(series) return averager if __name__ == '__main__': avg = make_averager() print avg(10) print avg(12) print avg(14)1.6 nonlocal声明 Python 3.0引进,示例如下:
def hellocounter (name): count=0 def counter(): nonlocal count count+=1 print 'Hello,',name,',',str(count[0])+' access!' return counter hello = hellocounter('ma6174')Python 2.X的版本可以将count的int类型变成dict或者list进行转换:
def hellocounter (name): count=[0] def counter(): count[0]+=1 print 'Hello,',name,',',str(count[0])+' access!' return counter hello = hellocounter('ma6174')1.7 实现一个简单的装饰器工作原理 Skip
1.8 标准库中的装饰器 functor.lru_cache()
1.9 叠放装饰器 Skip 1.10 参数化装饰器
# ------------------------------------ # 对带参数的函数进行装饰 # ------------------------------------ def functionWithoutParameter(func): def _deco(*args, **kwargs): func(*args, **kwargs) return _deco # ------------------------------------ # 对带参数的函数进行装饰 # ------------------------------------ def functionWithParameter(func): def _deco(a, b): func(a, b) return _deco # ------------------------------------ # 让装饰器带参数 # ------------------------------------ def decoratorWithParameter(arg): def _deco(func): def _deco(): print arg func() return _deco return _deco @decoratorWithParameter("my test") def testParameter(): pass二. 相关资料 2.1 装饰器 - 插入日志
# ------------------------------------ # 插入日志 # ------------------------------------ def insertLog(func): def wrapper(): logging.config.fileConfig('logging.conf') root_logger = logging.getLogger('main') root_logger.debug('test root logger...') func() return wrapper另:logging.conf
[loggers] keys=root,main [handlers] keys=consoleHandler,fileHandler [formatters] keys=fmt [logger_root] level=DEBUG handlers=consoleHandler [logger_main] level=DEBUG qualname=main handlers=fileHandler [handler_consoleHandler] class=StreamHandler level=DEBUG formatter=fmt args=(sys.stdout,) [handler_fileHandler] class=logging.handlers.RotatingFileHandler level=DEBUG formatter=fmt args=('test.log','a',20000,5,) [formatter_fmt] format=[%(asctime)s - %(levelname)s] - %(message)s datefmt=2.2 性能测试
# ------------------------------------ # 性能测试 # ------------------------------------ def performanceTest(func): def wrapper(): start_time = datetime.datetime.now() func() end_time = datetime.datetime.now() print "Used Time : %s" % str(end_time-start_time) return wrapper三. 阅读后感 本章节主要讲装饰器和闭包,对装饰器先前就有过了解,但在实际的编码过程中并没有使用到,后续将装饰器慢慢添加到自己的代码中。对于闭包还不是特别深入的了解,使用场景不是很明确,待进一步深入剖析。
参考: 1. Python装饰器:简单装饰,带参数装饰与类装饰器 2. Python中的闭包
