我正在尝试在 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?

实施情况

函数、方法、实例和类的编织就完成了。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top