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

posted @ 2018-06-13 17:56  潇雨危栏  阅读(198)  评论(0编辑  收藏  举报