美文网首页
装饰器入门(2)

装饰器入门(2)

作者: leoni999 | 来源:发表于2017-06-26 16:13 被阅读0次

    装饰器入门(1)
    接下来的话题:
    如果装饰器需要带参数应该怎么做?

    @log('execute')
    

    要给log函数传入一个参数(这里是字符串)

    def log(text):
        def decorator(func):
            # 保持函数本身签名等资源不变
            @functools.wraps(func)
            def wrapper(*args,**kw):
                print('begin call, %s %s():'%(text,func.__name__))
                func(*args,**kw)
                print('end call, %s %s()'%(text,func.__name__))
            return wrapper
        return decorator
    
    @log('execute')
    def now():
        print ('2017/6/26')
    now()
    

    输出:

    begin call, execute now():
    2017/6/26
    end call, execute now()
    

    这样就可以更自由地自定义参数了,
    比如这样能通过参数标识定位到执行函数。

    根据廖雪峰的装饰器一章,有道课后习题,如何实现@log, @log('execute')同时调用的情况
    这里我简单地实现了一下,还不是很完善。

    def log(text):
        if isinstance(text, None or str):
            def decorator(func):
                @functools.wraps(func)
                def wrapper(*args,**kw):
                    print('begin call, %s %s():'%(text,func.__name__))
                    func(*args,**kw)
                    print('end call, %s %s()'%(text,func.__name__))
                return wrapper
            return decorator
        else:
            @functools.wraps(text)
            def wrapper(*args, **kw):
                print('begin call, %s():' % (text.__name__))
                text(*args, **kw)
                print('end call, %s()' % (text.__name__))
            return wrapper
    

    相关文章

      网友评论

          本文标题:装饰器入门(2)

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