之前曾经写的装饰器例子
def mydecorator(func):
def wrapper(*args,**kargs):
'''wrapper function'''
print("in wrapper")
func(*args,**kargs)
return wrapper
@ mydecorator
def example():
"""example function"""
print("in example")
但是这样子会对函数的私有属性进行改变,
![](https://img.haomeiwen.com/i13660904/13fef4ca6d029106.png)
)
那么怎么避免这个情况
先上代码例子
>>> from functools import update_wrapper ,wraps,WRAPPER_ASSIGNMENTS,WRAPPER_UPDATES
>>> def mydecorator(func):
@wraps(func)
def wrapper(*args,**kargs):
"""wrapper function"""
print("in wrapper")
func(*args,**kargs)
#update_wrapper(wrapper,func)
return wrapper
>>> def example():
"""example function"""
print("in example")
>>> example = mydecorator(example)
>>> example()
in wrapper
in example
>>> example.__name__
'example'
这里主要的地方是functools这个模块,functools.reduce()函数式编程之一
map,filter,lambda,reduce
当然这次的主角换人了
主要是wraps,update_wrappers
![](https://img.haomeiwen.com/i13660904/f09f25ec9dba41c1.png)
接下来的三个是等价的
1、
@wraps(func) # 语法糖,注意位置
2、
update_wrapper(wrappper,func,assigned=('__module__','__name__','__doc__'),updated=('__dict__',))
3、
update_wrapper(wrappper, func, WRAPPER_ASSIGNMENTS, WRAPPER_UPDATES)
网友评论