文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Python实现自己的AOP

2023-01-31 02:05

关注

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
 
阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯