我试图在我的Python编程中使用一些AOP,但我没有任何存在的各种库的经验.
所以我的问题是:
Python存在哪些AOP支持?它们之间的不同库有什么优势?
我找到了一些,但我不知道他们如何比较:
Aspyct
适用于Python的轻量级AOP
在哪种情况下我会使用这些?
我有两个用Python编写的应用程序,它们通常有计算税收和其他金钱的方法.我希望能够编写一个功能的"骨架",并在运行时自定义它,例如更改地方税的应用方式(按国家,州或城市等),而不必重载全栈.
有关一些很好的示例,请参阅S.Lott关于Python装饰器的链接,并查看装饰器的定义PEP.
Python从一开始就有AOP,它没有一个令人印象深刻的名字.在Python 2.4中添加了装饰器语法,这使得应用装饰器在语法上非常好.
也许如果你想根据规则应用装饰器你需要一个库,但如果你愿意在声明它们时标记相关的函数/方法,你可能不会.
这是一个简单的缓存装饰器的例子(我为这个问题写了它):
import pickle, functools def cache(f): _cache = {} def wrapper(*args, **kwargs): key = pickle.dumps((args, kwargs)) if key not in _cache: _cache[key] = f(*args, **kwargs) # call the wrapped function, save in cache return _cache[key] # read value from cache functools.update_wrapper(wrapper, f) # update wrapper's metadata return wrapper import time @cache def foo(n): time.sleep(2) return n*2 foo(10) # first call with parameter 10, sleeps foo(10) # returns immediately
另一个用于python的AOP库将是pytilities
.它是目前最强大的(据我所知).
它的特点是:
制作可重复使用的Aspect类
将多个方面应用于实例或类
实例/类的unapply方面
使用方面向实例添加新属性
将建议应用于实例/类的所有属性
...
它还有其他一些好东西,比如一些特殊的描述符(参见文档)
在Python中,面向方面的编程通常包括在运行时动态修改类和实例,这通常称为monkeypatching.在回答另一个AOP问题时,我总结了Python中AOP的一些用例.