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

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

目录:

  1. 内容回顾
  2. 相关资料
  3. 阅读后感

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值