Python自己的AOP

转载 2012年03月27日 16:02:33

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 test:
     def __enter__(self):
          print("enter")
          return 1

     def __exit__(self, *args):
          print("exit")

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

with test() as t:
     function()
     print 't is', t


最后输出的结果是:

enter
function()
t is 1
exit

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

2)利用contextlib实现AOP

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

from contextlib import contextmanager

@contextmanager
def tag(name):
    print "<%s>" % name
    yield
    print "" % name

with tag("h1"):
    print "foo"


输出结果是:
<h1>
foo
</h1>

如果想在with子句中加入as variable,那么这个变量接收的是yield <value>中的value 其实tag方法相当于是一个模板,里面的yield是用来引导执行with子句中的主体部分的,这样一个AOP功能就实现了,OK!!

Python的AOP利器:装饰器

面向对象(OOP)的目的在于抽象 ,而面向切面(AOP)的目的在于解耦。在Java中面向切面编程需要使用反射(动态代理)实现,操作比较麻烦。而在Python语言中则提供了一个很好用的语法糖–装饰器....
  • iyeahme
  • iyeahme
  • 2015年09月09日 13:35
  • 1653

Python实现自己的AOP

Java中的AOP可以用JDK的动态代理和cglib来实现,将需要拦截的方法前后可以额外添加些功能。 Python中有许多方法去实现AOP,现在先介绍第一种比较简单的: 1)利用with....

python 装饰器与AOP

缓存 [python] view plaincopyprint? from functools import wraps    lineseq = '==' * 20    def mem...

Python里的闭包和AOP

习惯了写Java和JS代码,突然换成Python还真不习惯,最近在书上看到一段挺有意思的Python代码,才真心感觉到Python长盛不衰的价值。在很多语言里,如果在一个内部函数里,对外部作用域(但不...
  • Ant_Yan
  • Ant_Yan
  • 2013年10月19日 22:21
  • 1761

使用Python的元类实现AOP监控类方法调用过程

引言 Python的元类(metaclass)功能强大,能够实现AOP(Aspect-Oriented Programming,面向切面编程)的类似功能,本文以实现监控类方法执行所耗时间为例,参照本文...

Spring AOP示例

  • 2017年11月20日 19:18
  • 30.37MB
  • 下载

C# IOC与AOP相结合的实例

  • 2017年11月14日 13:26
  • 1.25MB
  • 下载

Spring MVC中AOP无效、不起作用,解决方案之一

最近由于项目原因,在Spring+SpringMVC+Mybatis的环境中,增加对controller或是service的日志监控,在网上搜了半天,按照SpringAop的配置出不了结果,在按照网上...

spring-aop-4.0.3.RELEASE-source.jar

  • 2017年10月21日 17:30
  • 321KB
  • 下载

AOP的jar包

  • 2017年11月08日 10:34
  • 1.79MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Python自己的AOP
举报原因:
原因补充:

(最多只允许输入30个字)