装饰器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)。与传统编程习惯的从上往下执行方式相比较而言,像是在函数执行的流程中横向地插入了一段逻辑。在特定的业务领域里,能减少大量重复代码。

作用

  • 日志记录
  • 性能测试(函数执行时间统计)
  • 执行函数前预备处理
  • 执行函数后清理功能
  • 权限、类型校验
  • 缓存
  • 事务处理

results matching ""

    No results matching ""