有没有适用于Python的AOP支持库?

31

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

所以我的问题是:

Python存在哪些AOP支持?它们之间的不同库的优点是什么?


编辑

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

编辑2

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

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


链接已失效。 - Adam Hughes
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

3
是的。我认为记忆化是一个简单概念的花哨名称,可能会让人难以理解。我对'AOP'这个术语也有类似的感觉。 - orip
1
@orip,你对“AOP”有类似的感觉,因为你的例子只包括了AOP的一个方面,即量化。它缺少了无意识(请参见http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.83.417&rep=rep1&type=pdf)。 - khatchad
1
@Raffi 不是的。我感谢你的区分,但我认为我用更易懂的术语提到了无知(基于规则应用),并承认在这种情况下你需要一个框架。我的感觉是关于AOP中过度使用术语实际上是从我对它非常熟悉的经验中演变而来的。 - orip
14
我不确定装饰器和AOP是同一件事。在我看来,使用AOP,您应该能够在不修改现有代码的情况下向现有代码添加新行为。 - rds
3
在Python中,你可以通过打补丁的方式来修改现有的代码,而不需要直接修改它。你不需要使用高级术语和技巧... - schlamar
显示剩余4条评论

7

编辑:我不再维护pytilities,它已经多年未得到维护。您可能需要考虑其他答案之一,或者参考Wikipedia上的列表

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

它的特点包括:

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

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


这个答案中的链接似乎已经失效了。 - NOhs
修复了链接(修复后的链接将在编辑经过同行评审后出现) - Tim Diels

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

3

那么BSD许可的python-aspectlib怎么样呢?

实现状态

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


1
这是唯一一个链接到一个方面库的答案,它似乎仍然可以与当前的Python一起使用。我投了赞成票。 - Nils Lindemann
谢谢@Nils - 即使它有点过时,但我找不到更近期/维护更好的东西。 - astrojuanlu

3

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

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

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


6
这不是一个答案,而是一则自我广告。-1 - Nils Lindemann
2
很好,你比较了这些库 - 但是"Aspyct"在哪里?为什么你推荐它? - cslotty
如果你要写一个宣传即将发表的论文的回答,那么一旦论文发表了,你应该提供链接。你的回答已经有13年了,并且没有足够的信息来找到这篇论文,即使我包括你的个人资料也不行。 - julaine

2

1
不,不是的。装饰器不是AOP(请参见我上面的评论)。 - khatchad
4
@RaffiKhatchadourian说:"Above"?答案可以按多种顺序排序(活跃度,最早发布,投票数)。 "Above"根本没有意义。 你在说什么? - S.Lott
1
从上面可以看出,您对'AOP'有类似的感觉,因为您的示例仅包括AOP的一个方面,即量化。它缺少无意识(请参见http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.83.417&rep=rep1&type=pdf)。 - khatchad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接