【问题标题】:Aspect oriented programming (AOP) in PythonPython中的面向方面编程(AOP)
【发布时间】:2012-09-03 14:47:24
【问题描述】:

可能重复:
Any AOP support library for Python?

我熟悉 Java 语言的 AspectJ 扩展。

我想知道 Python 是否有这样的东西。

不要误会,我不是指库,而是像 AspectJ 这样的语言扩展是 Java 的。

【问题讨论】:

  • 请记住 Python != Java。因此,在 Java 中需要完整的“语言扩展”的东西可能由 Python 中完全不同的机制(可能包括一个库)来执行。是否正在寻找任何特定的 AOP 方面?
  • @pst AspectJ 实际上是 Java 的一种。据我所知,有一些 Python 库实现了 AOP,但我不确定它们的主流接受度。
  • @esaelPsnoroMoN 我不是在询问库支持。但是,如果有或计划有支持 AOP 的语言扩展。
  • 我从未真正见过令人信服的 AOP 示例。并不是说没有用处,但这些示例总是看起来像是一种使代码更难理解的方法,但没有任何好处。
  • @coredump:正如我在回答中详细说明的那样:不可能是“支持 AOP 的计划语言扩展”,因为语言已经从头开始这样做了,因为它的动态性质。

标签: python aop python-extensions


【解决方案1】:

Python 不需要“语言扩展”之类的东西就能以面向方面的方式工作。

这仅仅是由于 Python 本身的动态机制。谷歌搜索会产生几个项目——尽管看起来只是像库,但它是 Python 所需要的。

这不是我编造的——事实上,您可以内省类和方法,并在运行时更改它们。当我第一次了解 Aspect Orientation 时,我可以在几个小时内用 Python 实现一些概念证明——当然,现有的一些项目可以提供生产质量的条目。

但是既然你问了,有一种 Python “语言扩展”可以用于 Aspect Orientation:当我进行上面提到的概念证明时,我曾经在运行时检查方法的输入参数确定某些方法是否会受到规则的影响。

在 Python 3 中,该语言有一个鲜为人知的特性,它允许注释函数或方法的输入参数和返回值。方面方向库可以利用这一点在“加载时”应用它的魔力,而不是在每个函数调用时。

顺便说一句,这里是我的快速破解,以获取将 Aspect Orientation 与纯 Python 结合使用的工作示例。抱歉 - 代码 cmets 在 pt_BR - https://bitbucket.org/jsbueno/metapython/src/f48d6bd388fd/aspect.py

【讨论】:

  • @gnychis:完成。我通常喜欢我的东西“以相同方式共享”,所以我将 LGPL_v3 作为一个整体附加到存储库中。由于您仅对 AOP 示例表现出兴趣,因此我将那个示例留在了 MIT,因此您不会感到受到任何限制。只是问你是否想要别的东西。 (如果你有一个项目可以使用它,我可能想配对升级到一个完整的 Python 模块)
  • 继续加油,非常感谢@jsbueno!我肯定有一个项目会使用它。我发现它是一个不错且简单的实现,而许多其他 AOP 库过于复杂。
  • 感谢您回到这个陈旧的答案 - 虽然我没有更新上面的代码,也没有检查库,但您会发现 Python 活力的可能性远远超出装饰器 -并且通过简单的库来拥有 AOP 的所有所需方面是完全可行的——因为它们可以在运行时拦截调用。使用相同的测试机制也很简单。 2020年,“全AOP”仍然是寻找问题的解决方案,各种局部解决方案——包括装饰器和事件系统,都可以解决AOP应该解决的主要痛点。
  • @jsbueno 我知道你可以在运行时拦截调用,而无需明确使用装饰器,我的错,我读错了问题-_-.....我刚刚意识到你写了“ Python 不需要语言扩展来实现 AOP”,这是完全正确的。我以为你写了“Python 不需要 AOP”,这就是我所争论的(处理横切关注点的目的)。我会对你的回答投赞成票。
  • 代码桶链接自 2021-02-19 起失效。如果有人可以在答案本身中为此添加示例代码,那将会很有帮助
【解决方案2】:
猜你喜欢
  • 1970-01-01
  • 2023-03-22
  • 2010-09-06
  • 2010-10-26
  • 1970-01-01
  • 2023-03-28
  • 2011-06-27
  • 2010-11-24
  • 2010-09-18
相关资源
最近更新 更多