zoukankan      html  css  js  c++  java
  • Python装饰器

    Python装饰器

    Python装饰器的概念很早就有听说,但是自己写代码很少刻意使用。不过,作为一种设计模式,装饰器在各种框架中被频繁使用,这里学习记录一下

    基本思想

    装饰器的思想,就是用一个函数装饰另一个函数。有赖于Python中『一切皆为对象』的设计原则,因此实现起来非常方便

    import logging
    
    
    def logging_decorate(func):
        # 用wrapper来修饰传进来的func
        def wrapper(*args, **kwargs):
            logging.warn("%s is running" % func.__name__)
            return func(*args, **kwargs)
    
        return wrapper
    
        
    def foo(name):
        print("hello ", name)
    
        
    # 用logging_decorate来装饰
    foo = logging_decorate(foo)
    print("autual function", foo.__name__,)  # 此时的foo事实上已经发生变化,真正的实体是wrapper
    foo("world")
    
    '''
    ('autual function', 'wrapper')
    ('hello ', 'world')
    WARNING:root:foo is running
    '''
    

    为了方便书写,添加了语法糖@

    @logging_decorate
    def foo(name):
        print("hello ", name)
    # 本质上就是 foo = logging_decorate(foo)
    

    带参装饰器

    参数是传给装饰器的而不是给被修饰的函数的,因此不能直接在原来的wrapper里面加参数(因为*args接收的是要传给func的)

    所以,我们可以在外面再加一层函数

    import logging
    
    # 这里的logging_decorate可以接收传给decorator的参数
    def logging_decorate(level):
     
        def decorator(func):
     
            def wrapper(*args, **kwargs):
                if level == "warn":
                    logging.warn("%s is running" % func.__name__)
                return func(*args)
     
            return wrapper
     
        return decorator
     
     
    @logging_decorate(level="warn")
    def foo(name):
        print("hello", name)
    
    
    foo("world")
    
    '''
    WARNING:root:foo is running
    ('hello', 'world')
    '''
    

    小结

    Python的装饰器可以实现面向切面编程,AOP虽然虽然早有耳闻,但真正使用的时候,才发现这种设计模式的威力,还是要好好学习。

  • 相关阅读:
    Java编程思想:第8章 多态
    Java编程思想:第7章 复用类
    Java编程思想:第6章 访问权限控制
    Java编程思想:第5章 初始化与清理
    Java编程思想:第4章 控制执行流程
    Java编程思想:第3章 操作符
    sqoop常用命令记录
    sqoop从hive导出到mysql报错: failed with state FAILED due to: Task failed
    flink-sql解析canal-json实现实时同步
    hive爬坑
  • 原文地址:https://www.cnblogs.com/fanghao/p/9179106.html
Copyright © 2011-2022 走看看