美文网首页
Beautiful, Idiomatic Python (二)

Beautiful, Idiomatic Python (二)

作者: 尼罗河上的小杀手 | 来源:发表于2017-09-17 10:16 被阅读5次

    零、Decorator(@ Syntactic Sugar)

    • 装饰器定义

    A decorator is the name used for a software design pattern. Decorators dynamically alter the functionality of a function, method, or class without having to directly use subclasses or change the source code of the function being decorated.

    • Hello world
      Code:
    def hello(fn):
        def wrapper():
            print("hello, %s" % fn.__name__)
            print("hello, %s" % foo.__name__)
            fn()
            print("goodby, %s" % fn.__name__)
            print("goodby, %s" % foo.__name__)
        return wrapper
    
    @hello
    def foo():
        print("i am foo")
    foo()
    

    Output:

    hello, foo
    hello, wrapper
    i am foo
    goodby, foo
    goodby, wrapper
    

    1) 函数foo 有个@hello, hello就是上面的函数。
    2) hello函数中有一个fn 参数(fn用来做回调的函数)
    3) hello函数中 返回了一个inner函数wrapper,这个wrapper函数回调了传进来的fn,并在回调前加了自己的函数体。

    • decorator 去修饰函数func时。
    @decorator
    def func():
    pass
    

    解释器会将上面的语句解释成这样:

    func = decorator(func)
    

    一、 Decorator 示例

    • 缓存
    _cache_db = dict()
    
    def cache(fn):
        def wrapper(*args):
            result = _cache_db.get(args,None)
            if result is None:
                result = fn(*args)
                _cache_db[args] = result
            return result
        return wrapper
    
    @cache
    def add(a, b):
        return a + b
    if __name__ == '__main__':
        assert add(3, 4) ==7
    

    二、reference

    https://coolshell.cn/articles/11265.html

    相关文章

      网友评论

          本文标题:Beautiful, Idiomatic Python (二)

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