流程的Python 第七章:函数装饰器和闭包

xiaoxiao2021-02-28  102

前言: 本章节的最终目标是解释清楚函数装饰器的工作原理,包括最简单的注册装饰器和较复杂的参数化装饰器。

目录:

内容回顾相关资料阅读后感

正文: 一. 内容回顾 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中的闭包

转载请注明原文地址: https://www.6miu.com/read-71243.html

最新回复(0)