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:15
  • 2327

Python实现自己的AOP

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

python 装饰器与AOP

无高见 1.缓存 from functools import wraps lineseq = '==' * 20 def memo( func ): cache = {} ...
  • u011659057
  • u011659057
  • 2014-05-27 20:33:55
  • 1475

python总结(一):AOP与装饰器

如果有AOP的编程经验,理解Python的装饰器就是分分钟的事。既然是装饰器,那么对被装饰的对象来说,一定是功能得到了增强,按方法能增强的地方进行划分,又可以分为以下四类: 1. 方法调用前; 2...
  • yiifaa
  • yiifaa
  • 2017-09-17 18:30:11
  • 284

AOP的实现的几种方式

静态AOP 在编译期,切面直接以字节 码的形式编译到目标字节 码文件中。 AspectJ属于静态AOP,是在编译时进行增强,会在编译的时候将AOP逻辑织入到代码中,需要专有的编译器和织入器。 优点...
  • csujiangyu
  • csujiangyu
  • 2016-12-04 16:57:33
  • 6441

python 装饰器与AOP

缓存 [python] view plaincopyprint? from functools import wraps    lineseq = '==' * 20    def mem...
  • lhf2009913
  • lhf2009913
  • 2015-01-04 17:15:44
  • 443

自己动手写一个web框架(二):实现AOP

系列文章: 自己动手写一个web框架(一):实现IOC与MVC 一、基本介绍 实现功能:controller中所有的方法被调用时,计算调用所耗时长。 基本技术:动态...
  • u012422829
  • u012422829
  • 2015-11-16 18:23:59
  • 2179

java(spring)手把手教你写个AOP框架

Why AOP? AOP基本术语 AOP执行流程 动手实现一个AOP 源代码   Why AOP?   AOP(Aspect-Oriented ...
  • lbdreaming
  • lbdreaming
  • 2016-03-04 11:32:28
  • 1189

Python下载网页图片

Python版本是3.3.2 主要就是 urllib相对于2.x有很大变化# -*- coding:utf-8 -*- import urllib.request path = "D:\\Dow...
  • wudishine
  • wudishine
  • 2013-09-10 21:26:17
  • 25284

利用metaclass实现python的aop

修行Python个把星期,终于有点成果了,呵呵,一个利用metaclass实现的aop。 其实python这类非常动态的语言要实现AOP是很容易的,所以首先我们要来先定义一个metaclass ...
  • wdt3385
  • wdt3385
  • 2014-02-24 16:11:50
  • 603
收藏助手
不良信息举报
您举报文章:Python自己的AOP
举报原因:
原因补充:

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