【问题标题】:Any AOP support library for Python?有任何 Python 的 AOP 支持库吗?
【发布时间】:2010-09-22 03:58:14
【问题描述】:

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

所以我的问题是:

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


编辑

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

编辑 2

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

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

【问题讨论】:

  • 链接不再起作用

标签: python aop


【解决方案1】:

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

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

它的特点是:

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

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

【讨论】:

  • 此答案中的链接似乎已损坏。
  • 修复了链接(修改后会出现固定链接)
【解决方案2】:

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

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

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

【讨论】:

  • 这不是答案,而是自我广告。 -1
  • 很高兴您比较了这些库 - 但它在哪里,“Aspyct”以及您为什么推荐它?
【解决方案3】:

BSD 许可的python-aspectlib 怎么样?

实施状况

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

【讨论】:

  • 这是链接到似乎仍可与当前 Python 一起使用的方面库的唯一答案。投我一票。
  • 谢谢@Nils - 即便如此它有点过时了,但我找不到任何更新/更好维护的东西
【解决方案4】:

查看 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

【讨论】:

  • 这不是用不同的名字来记忆吗?
  • 是的。我认为记忆化是一个简单概念的花哨名称,它可以使它更难理解。我对“AOP”这个词也有类似的感受。
  • @orip 您对“AOP”有类似的感觉,因为您的示例仅包含 AOP 的一个方面,即量化。它缺少遗忘(见citeseerx.ist.psu.edu/viewdoc/…)。
  • 我不相信装饰和 AOP 是一回事。恕我直言,使用 AOP,您应该能够在不修改现有代码的情况下向现有代码添加新行为。
  • @rds 在 Python 中,您可以直接修补现有代码而无需直接修改它。你不需要花哨的术语和技巧……
【解决方案5】:

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

【讨论】:

    【解决方案6】:

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

    【讨论】:

    • 不,不是。装饰不是 AOP(见我上面的评论)。
    • @RaffiKhatchadourian:“高于”?答案可以按各种顺序排序。 (活跃,最老,投票)。 “上面”根本没有任何意义。你在说什么?
    • 从上面:你对'AOP'有类似的感觉,因为你的例子只包括AOP的一个方面,即量化。它缺少遗忘(见citeseerx.ist.psu.edu/viewdoc/…)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-05
    • 1970-01-01
    • 1970-01-01
    • 2010-09-17
    相关资源
    最近更新 更多