专栏首页python3Python实现自己的AOP

Python实现自己的AOP

Java中的AOP可以用JDK的动态代理和cglib来实现,将需要拦截的方法前后可以额外添加些功能。

Python中有许多方法去实现AOP,现在先介绍第一种比较简单的:

1)利用with...as...

Python的with...as...子句是用于控制执行流程的语句,结构是with expression as variable,这里的expression里定义拦截的方法前后需要执行的逻辑,分别定义“__enter__”和“__exit__”方法,“__enter__”方法定义拦截方法执行前的逻辑,“__exit__”方法定义拦截方法执行后的逻辑,with...as...子句的主体是拦截的方法执行的逻辑,variable变量是用来接收“__enter__”方法返回的值,下面来看个示例:

class AOP:       def __enter__(self):            print("before action enter")            return 1       def __exit__(self, *args):           print("after action enter")           return 0 def Myfunction():       print ('Myfunction() called and processed ')      return 111 

def Myfunction1():       print ('Myfunction1()  called and processed')      return 222

def MyMain():            with AOP() as AOPValue:                       print ('AOPValue is %s'%AOPValue)                       Myfunction()                       Myfunction1() if __name__ == '__main__':            MyMain()

最后输出的结果是:

before action enter AOPValue is 1 Myfunction() called and processed Myfunction1()  called and processed after action enter

PS:with子句中的variable接收的是__enter__方法的返回值。这是with子句的基本用法

2)利用contextlib实现AOP

Python核心库中的contextlib中的contextmanager来实现AOP就非常简单了,contextmanager是一个装饰器,具体用法如下示例:

from contextlib import contextmanager 

#define inteceptors

@contextmanager  def AOPfunc(name):      print ("before:some actions done")      yield      print ("after:some actions done ") 

#normal service flow  def BusinessProcess1():       print ('BusinessProcess1()')      return 111 

def BusinessProcess2():       print ('BusinessProcess2()')      return 111

def BusinessProcess3():       print ('BusinessProcess3()')      return 111

#main flow def MyMain():            with AOPfunc("aop"):                       BusinessProcess1()                       BusinessProcess2()            with AOPfunc("aop"):                        BusinessProcess3()

if __name__ == '__main__':            MyMain()

运行结果是:

before:some actions done BusinessProcess1() BusinessProcess2() after:some actions done before:some actions done BusinessProcess3() after:some actions done

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python又把GUI界面攻下了,今天就

    学Python这么久了,一直想做个界面出来,最近发现Python有个内置库tkinter,利用它可以很轻松做出一些简易的UI界面,首先来看Python官方对Tk...

    py3study
  • python3——print使用

    py3study
  • 从 Python到Tensorflow

    前者会输出False,而后者会输出None.可以在get函数参数指定想要得到的value(如何找不到对应的value,则输出预设的值)

    py3study
  • Python编程思想(3):数字及其相关运算

    Python 提供了三种数值类型:int(整型),float(浮点型)和complex(复数)。

    蒙娜丽宁
  • Python基础语法

    https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c...

    六月的雨
  • numpy中的nonzero()的用法

    当使用布尔数组直接作为下标对象或者元组下标对象中有布尔数组时,都相当于用nonzero()将布尔数组转换成一组整数数组,然后使用整数数组进行下标运算。

    学到老
  • Python学习笔记 控制流和函数

    控制流 条件语句 Python只有一种条件语句,那就是if语句。如果需要多重分支,使用if-elif-else结构。Python没有switch语句,条件语句只...

    乐百川
  • python3——print使用

    py3study
  • 一日一技:print函数也能写文件

    虽然也可以把写文件的操作封装到一个函数里面,不过实际上Python 3的 print函数就能够直接写文件:

    青南
  • Python常见的脚本汇总

    斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13;特别指出:第0项是0,第1项是第一个1。从第三项开始,每一项都等于前两项之和。

    py3study

扫码关注云+社区

领取腾讯云代金券