Python的任何AOP支持库?

时间:2008-11-13 13:51:28

标签: python aop

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

所以我的问题是:

  

Python存在哪些AOP支持?它们之间的差异库有什么优势?


修改

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

编辑2

我会在哪种情况下使用这些?

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

6 个答案:

答案 0 :(得分:23)

有关一些很好的示例,请参阅S.Lott关于Python装饰器的链接,并参阅defining PEP for decorators

Python从一开始就有AOP,它没有一个令人印象深刻的名字。 在Python 2.4中添加了装饰器语法,这使得装饰器在语法上非常好用。

也许如果你想根据规则应用装饰器你需要一个库,但如果你愿意在声明它们时标记相关的函数/方法,你可能不会。

这是一个简单的缓存装饰器的例子(我为this question写了一个):

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

答案 1 :(得分:7)

编辑:我不再保持热情,多年来一直没有维护。您可能需要考虑其他答案之一或此list on Wikipedia

另一个用于python的AOP库将是pytilitiesDocumentation; svn repo)。它目前是最强大的(据我所知)。

它的特点是:

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

它还有其他一些好东西,比如一些特殊描述符(参见文档)

答案 2 :(得分:5)

在Python中,面向方面的编程通常包括在运行时动态修改类和实例,这通常称为monkeypatching。在回答另一个AOP问题时,我总结了其中一些use cases for AOP in Python

答案 3 :(得分:4)

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

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

我将在下一次会议之一上发表一篇论文,其中包括一个真实的行业用例。

答案 4 :(得分:1)

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

答案 5 :(得分:1)

BSD许可python-aspectlib怎么样?

  

实施状态

     

完成编织函数,方法,实例和类。