python装饰器
2016-07-13 18:06
579 查看
为函数动态地添加功能,却又不想改变原函数的定义:
那么就可以用一个函数B接受函数A为参数,然后B再返回一个函数。A是被修饰的函数,返回的函数是修饰过后的函数,我们通过调用修饰后的函数就可以实现动态添加功能。
log(now)是修饰后的函数,加上()就是对wrapper的调用,输出结果为
上面是一种基本的装饰器实现方式,但是仔细想想,我希望每次调用now都给它动态添加功能,难道我每次调用now都得像log(now)()这么写?其实python含有对装饰器的语法级支持:
输出和上面是一样的。
在now函数的定义前加上@log标记,now变量就是指向了修饰后的函数,即相当于执行了now=log(now),now变量不再指向原函数对象
上面的是不接受参数的装饰器,下面来看接受参数的装饰器:
输出为:
没有语法级支持的话,本来应该是这么写得:
上面的两种装饰器的定义都没错,但是还差一步。上面那样经过修饰的函数,它们的name属性已经从’now’变成了’wrapper’.可能会影响一些依赖函数签名的代码执行。
无参的decorator:
或者有参的decorator:
本文是初学廖雪峰python教程,所写笔记,代码示例是廖大的。
那么就可以用一个函数B接受函数A为参数,然后B再返回一个函数。A是被修饰的函数,返回的函数是修饰过后的函数,我们通过调用修饰后的函数就可以实现动态添加功能。
def log(func): def wrapper(*args, **kw): print 'call %s():' % func.__name__ return func(*args, **kw) return wrapper def now(): print '2013-12-25' log(now)()
log(now)是修饰后的函数,加上()就是对wrapper的调用,输出结果为
call now(): 2013-12-25
上面是一种基本的装饰器实现方式,但是仔细想想,我希望每次调用now都给它动态添加功能,难道我每次调用now都得像log(now)()这么写?其实python含有对装饰器的语法级支持:
def log(func): def wrapper(*args, **kw): print 'call %s():' % func.__name__ return func(*args, **kw) return wrapper @log def now(): print '2013-12-25' now()
输出和上面是一样的。
在now函数的定义前加上@log标记,now变量就是指向了修饰后的函数,即相当于执行了now=log(now),now变量不再指向原函数对象
上面的是不接受参数的装饰器,下面来看接受参数的装饰器:
def log(text): def decorator(func): def wrapper(*args, **kw): print '%s %s():' % (text, func.__name__) return func(*args, **kw) return wrapper return decorator @log('execute') def now(): print '2013-12-25' now()
输出为:
execute now(): 2013-12-25
没有语法级支持的话,本来应该是这么写得:
def now(): print '2013-12-25' def log(text): def decorator(func): def wrapper(*args, **kw): print '%s %s():' % (text, func.__name__) return func(*args, **kw) return wrapper return decorator log('execute')(now)()
上面的两种装饰器的定义都没错,但是还差一步。上面那样经过修饰的函数,它们的name属性已经从’now’变成了’wrapper’.可能会影响一些依赖函数签名的代码执行。
无参的decorator:
import functools def log(func): @functools.wraps(func) def wrapper(*args, **kw): print 'call %s():' % func.__name__ return func(*args, **kw) return wrapper
或者有参的decorator:
import functoolsdef log(text): def decorator(func): @functools.wraps(func) def wrapper(*args, **kw): print '%s %s():' % (text, func.__name__) return func(*args, **kw) return wrapper return decorator
本文是初学廖雪峰python教程,所写笔记,代码示例是廖大的。
相关文章推荐
- python socket编程详细介绍
- python 获取昨天时间戳
- python *args **kwargs用法
- Python 字符串格式化 数字游戏
- 使用循环和递归方法实现二分法搜索
- Python unicode equal comparison failed
- Python 字符串格式化
- python 输出日志跑不动 死锁现象
- python hbase
- python判断今天是否是本月的第一天
- hive SQL调用python脚本遇到的几个问题
- python访问mysql
- python获取当前 昨天 及所有时间
- python 代理池
- python爬虫1
- python 字符串
- Python3之uuid模块
- ipython 源码安装
- python爬虫
- python 发送邮件实例