1 装饰器
在代码运行期间动态增加功能的方式,称为“装饰器”(decorator)。
1)实际上,decorator就是一个返回函数的高阶函数。
# 定义一个函数,打印时间字符串
>>> def now():
... print('2018-7-27')
...
# 获取函数的名字
>>> now.__name__
'now'
# 定义一个decorator
>>> def log(func):
... def wrapper(*args, **kw):
... print('call %s():' %func.__name__)
... return func(*args, **kw)
... return wrapper
...
# 给now函数加上一个装饰器
>>> @log
... def now():
... print('2018-7-27')
...
# 调用now函数,显示打印结果
>>> now()
call now():
2018-7-27
2)若装饰器本身需要传入参数
# 定义装饰器
>>> 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('2018-7-27')
...
# 调用函数,显示结果
>>> now()
execute now():
2018-7-27
3)一个完整的装饰器写法,在上面代码中添加一行:@functools.wraps(func)
添加这句话后,再使用装饰器后,now.name就不再是’wrapper’,而是原名。
# 不带参数
>>> import functools
>>> def log(func):
... @functools.wraps(func)
... def wrapper(*args, **kw):
... print('call %s():' %func.__name__)
... return func(*args, **kw)
... return wrapper
...
# 带参数
>>> import functools
>>> def 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
...
2 偏函数
偏函数(Partial function):把一个函数的某些参数固定住(也就是设置默认值),返回一个新函数,调用这个函数会更简单。
示例:
>>> import functools
# 偏函数:转换成二进制
>>> int2=functools.partial(int, base=2)
>>> int2('10000')
16
# 在调用时,可以将参数更改
>>> int2('10000', base=10)
10000
# 创建偏函数时,实际上可以接受函数对象、*args和**kw3个参数
>>> max2=functools.partial(max,10)
>>> max2(5,6,7)
10