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的functools模块

这个模块提供了3个有趣的函数,这里介绍下其用法。 首先是partial函数,它可以重新绑定函数的可选参数,生成一个callable的partial对象:>>> int('10') # 实际上等同...

【python】装饰器 Decorator wrapper

装饰器 在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator)。本质上,decorator就是一个返回函数的高阶函数。关键字wrapper >>>def now():        ...

Python实现自己的AOP

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

Python装饰器-面向切面的编程AOP2

这几天花了点时间了解了下Python的装饰器。其实以前在书上也看过有关的内容,不过当时不理解。今天把自己的一点体会写出来跟大家分享一下。     网上流传得比较广的,有关python装饰器的文章...

Python的AOP利器:装饰器

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

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

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

Spring中的AOP不生效

  • 2017-01-10 10:47
  • 534B
  • 下载

spring aop事务通知(切面异常处理)

Spring Aop切面异常日志记录,本教程使用spring aop来记录service层所报出的异常记录,这样就可以很容易的知道我们项目的异常出现在哪个service方法中了,下面是spring a...

aop日志(个人工作)

内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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