装饰器入门(2)

装饰器入门(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))