装饰器decorator
概念
装饰器本质就是一个函数,用来包装函数的函数,装饰器在函数声明完成的时候被调用,调用之后声明的函数被换成一个被装饰器修饰后的函数。 把一个函数作为输入并且返回另外一个函数。
装饰器可以帮助用户抽离出大量与功能无关的相同代码。 为已经存在的代码添加额外的功能。
通常在装饰器中会使用下面的python技巧:
- *args,**kwargs
- 闭包
- 作为参数的函数
装饰器形式
def do_log(func):
print ("begin")
func()
print ("done")
@do_log
def work():
print('woring')
#会输出begin working foo done
装饰器语法以@开头 接着是装饰器函数的名称、可选参数。
顾名思义 我们使用装饰器函数timefun来装饰foo函数。
原来
@do_log
def work():
print('woring')
相当于
def work():
print('woring')
work = do_log(foo)
work()
多重装饰器
如果还有一个装饰器叫echo_info呢
def echo_info(func):
print ("echo begin")
func()
print ("echo end")
@echo_info
@do_log
def work():
print('woring')
等价于下面的代码
work= echo_info ( do_log(work))
work()
多重装饰器作用下
有参数
#coding=utf-8
def do_log(func):
def warpper():
print ("begin")
func()
print ("end")
return warpper
@do_log
def work():
print('woring')
work()
# work = do_log(work)
@f1(arg)
@f2
def func(): pass
# is equivalent to: 上面等价于下面
def func(): pass
func = f1(arg)(f2(func))
AOP面向切面编程
函数进入和退出时需要计时,这被称为一个横切面(Aspect),这种编程方式被称为面向切面的编程(Aspect-Oriented Programming)。与传统编程习惯的从上往下执行方式相比较而言,像是在函数执行的流程中横向地插入了一段逻辑。在特定的业务领域里,能减少大量重复代码。
作用
- 日志记录
- 性能测试(函数执行时间统计)
- 执行函数前预备处理
- 执行函数后清理功能
- 权限、类型校验
- 缓存
- 事务处理