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