题
我正在尝试在 Python 编程中使用一些 AOP,但我对现有的各种库没有任何经验。
所以我的问题是:
Python 有哪些 AOP 支持?它们之间的不同库有何优点?
编辑
我找到了一些,但我不知道它们如何比较:
编辑2
我将在什么情况下使用这些?
我有两个用 Python 编写的应用程序,它们通常具有计算税收和其他金钱事物的方法。我希望能够编写功能的“骨架”,并在运行时对其进行自定义,例如更改地方税的适用方式(按国家、州或城市等),而不必超载全栈。
解决方案
编辑:我不再维护 pytilities,它已经多年无人维护了。您可能想考虑其他答案之一或这个 维基百科上的列表.
python 的另一个 AOP 库是 pytilities
(文档; SVN 仓库)。它是目前最强大的(据我所知)。
其特点是:
- 制作可重用的 Aspect 类
- 将多个方面应用于实例或类
- 取消将方面应用于实例/类
- 使用切面向实例添加新属性
- 将建议应用于实例/类的所有属性
- ...
它还有其他好处,例如一些特殊描述符(请参阅文档)
其他提示
请参阅 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中,面向方面的编程通常包括在运行时动态修改类和实例,这通常称为monkeypatching。在另一个AOP问题的回答中,我总结了其中的一些 Python 中 AOP 的用例.
使用注释并不是真正的 AOP,因为编织过程有些硬编码。
Python中有几个AOP框架(我统计比较了8个,其中 Aspyct
是明显的赢家)。
我将在接下来的一次会议上发表一篇论文,其中包含我的发现,包括现实生活中的行业用例。
我会从 Python 装饰器库. 。其中大部分都是 AOP 之类的东西。
BSD 许可的怎么样? python-aspectlib?
实施情况
函数、方法、实例和类的编织就完成了。