AOPしてみる
python2.4にはDecorators for Functions and Methodsなるものが導入されている。
PEP 318: http://www.python.org/dev/peps/pep-0318/
これを使って、AOPをでっちあげてみた
class Advice: def __init__(self, pointcut): self.pointcut = pointcut def __call__(self, advice): def proxy(instance, *args, **kwargs): advice(None, self.pointcut.targetmethod, instance, *args, **kwargs) self.pointcut.weaveProxy(proxy) return proxy class MethodJoinPoint: def __init__(self, targetmethod): self.targetmethod = targetmethod def weaveProxy(self, proxy): setattr(self.targetmethod.im_class, self.targetmethod.im_func.func_name, proxy)
実際の使い方
ウィーブ対象はHelloクラスのsayMessageメソッド
class Hello: def __init__(self, message="Hello, world!"): self.message = message def sayMessage(self): print self.message
sayMessageメソッド呼び出しに対するインターセプターは以下のように書く
""" >>> hello.Hello("Hello, aspect!").sayMessage() before Hello, aspect! after >>> DerivedHello("Hello, subtype!").sayMessage() before Hello, subtype! after """ import hello import aspect class DerivedHello (hello.Hello): pass class Trace: @aspect.Advice(aspect.MethodJoinPoint(hello.Hello.sayMessage)) def f(self, target, instance, *args, **kwargs): print "before" target(instance, *args, **kwargs) print "after" if __name__ == '__main__': import doctest doctest.testmod()
DerivedHelloクラスはサブクラスだが、こちらにもインターセプターはきいている