关闭

Python自己的AOP

标签: pythonaopfunctionimportjdkclass
2202人阅读 评论(0) 收藏 举报
分类:

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!!
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:294131次
    • 积分:3022
    • 等级:
    • 排名:第11524名
    • 原创:85篇
    • 转载:39篇
    • 译文:3篇
    • 评论:10条
    最新评论