pyhotn3入门基础-15 装饰器与偏函数
来源:互联网 发布:美团程序员工资待遇 编辑:程序博客网 时间:2024/05/29 18:24
函数对象有一个__name__
属性,可以拿到函数的名字:
>>> def now():print('2017-6-15')>>> f = now>>> f()2017-6-15>>> f.__name__'now'>>> now.__name__'now'
假设我们要增强
now()
函数的功能,比如,在函数调用前后自动打印日志,但又不希望修改now()
函数的定义,这种在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator)decorator就是一个返回函数的高阶函数
def log(func): def wrapper(*args, **kw): print('call %s():' % func.__name__) return func(*args, **kw) return wrapper
要借助Python的@语法,把decorator置于函数的定义处:
>>> @logdef now():print('2017-06-15')
调用
now()
函数,不仅会运行now()
函数本身,还会在运行now()
函数前打印一行日志:>>> now()call now():2017-06-15
把@log
放到now()
函数的定义处,相当于执行了语句:
now = log(now)
由于log()
是一个decorator,返回一个函数,所以,原来的now()
函数仍然存在,只是现在同名的now
变量指向了新的函数,于是调用now()
将执行新函数,即在log()
函数中返回的wrapper()
函数。
wrapper()
函数的参数定义是(*args, **kw)
,因此,wrapper()
函数可以接受任意参数的调用。在wrapper()
函数内,首先打印日志,再紧接着调用原始函数。
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('2015-3-25')结果:
>>> now()execute now():2015-3-25效果等同于
>>> now = log('execute')(now)
>>> now.__name__'wrapper'
因为返回的那个wrapper()
函数名字就是'wrapper'
,所以,需要把原始函数的__name__
等属性复制到wrapper()
函数中,否则,有些依赖函数签名的代码执行就会出错。
不需要编写wrapper.__name__ = func.__name__
这样的代码,Python内置的functools.wraps
就是干这个事的,所以,一个完整的decorator的写法如下:
import functoolsdef log(func): @functools.wraps(func) def wrapper(*args, **kw): print('call %s():' % func.__name__) return func(*args, **kw) return wrapper
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
简单总结
functools.partial
的作用就是,把一个函数的某些参数给固定住(也就是设置默认值),返回一个新的函数,调用这个新函数会更简单。阅读全文
0 0
- pyhotn3入门基础-15 装饰器与偏函数
- pyhotn3入门基础-7函数
- pyhotn3入门基础-13 高阶函数
- pyhotn3入门基础-1
- pyhotn3入门基础-14 返回函数和匿名函数
- pyhotn3入门基础-5条件判断与循环
- pyhotn3入门基础-3 字符串
- pyhotn3入门基础-8切片
- pyhotn3入门基础-11 生成器
- pyhotn3入门基础-12 迭代器
- pyhotn3入门基础-2数据类型和变量
- pyhotn3入门基础-9迭代
- pyhotn3入门基础-10 列表生成式
- pyhotn3入门基础-4 使用list和tuple
- pyhotn3入门基础-6使用dict和set
- Python3 基础:装饰器和偏函数
- generator,迭代器,装饰器与偏函数
- Python入门 第五天(装饰器、偏函数)
- MySQL数据库InnoDB存储引擎Log漫游(3)
- hadoop要点
- plsql developer正确连接数据库步骤教学
- trading system and methods
- MapReduce之求一组数据中最大值问题
- pyhotn3入门基础-15 装饰器与偏函数
- 视Geopainting GPSMapEdit.v2.1.78.8.16 1CD(可视化的GPS地图编辑器)
- 也是一种感慨
- 53、表示数值的字符串
- eclipse的从头配置
- Linux编程基础——GDB(设置断点)
- markdown编辑器简明资料
- 图结构解决农夫过河问题(二附源代码)
- 六种方法实现JavaScript数组去重