美文网首页
2019-05-26

2019-05-26

作者: 测序九月 | 来源:发表于2019-05-26 17:56 被阅读0次

之前曾经写的装饰器例子

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")

但是这样子会对函数的私有属性进行改变,

( image.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


image.png

接下来的三个是等价的
1、

@wraps(func) # 语法糖,注意位置

2、

update_wrapper(wrappper,func,assigned=('__module__','__name__','__doc__'),updated=('__dict__',))

3、

update_wrapper(wrappper, func, WRAPPER_ASSIGNMENTS, WRAPPER_UPDATES)

相关文章

网友评论

      本文标题:2019-05-26

      本文链接:https://www.haomeiwen.com/subject/nykftctx.html