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虽然虽然早有耳闻,但真正使用的时候,才发现这种设计模式的威力,还是要好好学习。

  • 相关阅读:
    Jzoj3555 树的直径
    Jzoj3555 树的直径
    51Nod1022 石子归并V2
    51Nod1022 石子归并V2
    Bzoj3998 弦论
    Bzoj3998 弦论
    Poj2758 Checking the Text
    Poj2758 Checking the Text
    常用SQL语句大全
    Silverlight调用GP服务第二篇之调用GP服务(Geoprocessing Service)过程详解
  • 原文地址:https://www.cnblogs.com/fanghao/p/9179106.html
Copyright © 2011-2022 走看看