31

我正在尝试在我的 Python 编程中使用一些 AOP,但我对现有的各种库没有任何经验。

所以我的问题是:

Python 有哪些 AOP 支持?它们之间的不同库的优势是什么?


编辑

我找到了一些,但我不知道它们如何比较:

编辑 2

我将在什么情况下使用这些?

我有两个用 Python 编写的应用程序,它们通常具有计算税收和其他金钱事物的方法。我希望能够编写一个功能的“骨架”,并在运行时对其进行自定义,例如更改地方税的应用方式(按国家、州或城市等),而不必超载全栈。

4

6 回答 6

24

请参阅 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
于 2008-11-13T17:39:10.000 回答
7

编辑:我不再维护 pytilities 并且多年来一直无人维护。您可能需要考虑其他答案之一或Wikipedia 上的此列表

python 的另一个 AOP 库是pytilities文档svn repo)。它是目前最强大的(据我所知)。

它的特点是:

  • 制作可重用的方面类
  • 将多个方面应用于实例或类
  • 对实例/类取消应用方面
  • 使用方面向实例添加新属性
  • 将建议应用于实例/类的所有属性
  • ...

它还有其他好处,例如一些特殊的描述符(请参阅文档)

于 2011-03-07T13:48:30.660 回答
6

在 Python 中,面向方面的编程通常包括在运行时动态修改类和实例,这通常称为猴子补丁。在回答另一个 AOP 问题时,我总结了 Python 中 AOP 的一些用例

于 2008-11-13T14:11:06.767 回答
4

使用注解并不是真正的 AOP,因为编织过程有些硬编码。

Python 中有几个 AOP 框架(我数了数并比较了其中的 8 个,其中Aspyct明显是赢家)。

我将在接下来的一个会议上发表一篇论文,其中包含我的发现,其中包括一个现实生活中的行业用例。

于 2010-05-21T19:08:59.983 回答
3

BSD 许可的python-aspectlib呢?

实施状况

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

于 2015-12-15T10:59:24.960 回答
2

我将从Python Decorator Library开始。其中大部分是AOP之类的东西。

于 2008-11-13T14:05:33.283 回答