1. 装饰器实质上就是一个函数, 该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前提下增加额外的功能,装饰器的返回值也是一个函数对象。
装饰器被用于有切面需求的场景,较为经典的有插入日志,性能测试,事务处理等。 通过修饰器,可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用,装饰器的作用就是为已经存在的对象添加额外的功能。
装饰器在python 使用如此方法归因于python 的函数能像普通的对象一样能作为参数传递给其他函数,可以赋值给其他变量, 可以作为返回值 ,也可被定义在另外一个函数内。
装饰器举例:
def use_logging(func):
def wrapper(*args, **kwargs):
logging.warn("%s is running"%func.__name__)
return func(*args)
return wrapper
@use_logging
def foo():
print("i am foo")
@use_logging
def bar():
print(" i am a bar")
bar()
带参数的装饰器——装饰器可以是带参数的装饰器。
def user_logging(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
@use_logging(level="warn")
def foo(name = "foo"):
print("i am %s" %name)
foo
类的装饰器
from functools import wraps wraps 本身是一个装饰器,它能把原函数的元信息拷贝到装饰器函数中,是的装饰器函数也和原函数一样的元信息了。