前言:
本章节的最终目标是解释清楚函数装饰器的工作原理,包括最简单的注册装饰器和较复杂的参数化装饰器。
目录:
- 内容回顾
- 相关资料
- 阅读后感
正文:
一. 内容回顾
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
三. 阅读后感
本章节主要讲装饰器和闭包,对装饰器先前就有过了解,但在实际的编码过程中并没有使用到,后续将装饰器慢慢添加到自己的代码中。对于闭包还不是特别深入的了解,使用场景不是很明确,待进一步深入剖析。