python:装饰器
python装饰器的前提是Python 中的函数和 Java、C++不太一样,Python 中的函数可以像普通变量一样当做参数传递给另外一个函数,例如:
def foo(): print("foo") def bar(func): func() bar(foo)
概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。首先,需要定义一个装饰器函数,接受另外一个函数作为参数:
def use_logging(level): def decorator(func): def wrapper(*args, **kwargs): if level == "warn": logging.warn("%s is running" % func.__name__) elif level == "info": logging.info("%s is running" % func.__name__) return func(*args) return wrapper return decorator
通过@调用装饰器修饰函数:
@use_logging(level="warn") def foo(name='foo'): print("i am %s" % name) foo()
上面的 use_logging 是允许带参数的装饰器。它实际上是对原有装饰器的一个函数封装,并返回一个装饰器。我们可以将它理解为一个含有参数的闭包。当我 们使用@use_logging(level="warn")
调用的时候,Python 能够发现这一层的封装,并把参数传递到装饰器的环境中。
@use_logging(level="warn")
等价于@decorator