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