Python中的面向方面编程(AOP)

36

可能有重复:
Python有任何AOP支持库吗?

我熟悉Java语言的AspectJ扩展。

我想知道Python是否有类似的东西。

别误会,我的意思不是库,而是像Java中的AspectJ一样的语言扩展。


11
请记住Python不等于Java。因此,Java中需要完整的“语言扩展”的某些功能在Python中可能会通过完全不同的机制来执行(包括可能只是一个库)。有没有特定的AOP方面正在寻找? - user166390
AspectJ 是 Java 的事实标准。据我所知,有一些 Python 库实现了 AOP,但它们的主流接受程度还不确定。 - coredump
1
@esaelPsnoroMoN 我并不是在询问库的支持情况。但是,如果有计划支持AOP的语言扩展,或者已经支持了,请告知。 - coredump
我从未真正看到过一个令人信服的AOP示例。并不是说它没有用处,但这些示例总是让代码变得更加难以理解,却没有任何好处。 - Marcin
@coredump:正如我在我的回答中更详细地说明的那样:这不可能是一个“计划中支持AOP的语言扩展”,因为由于其动态性质,该语言从一开始就已经支持了AOP。 - jsbueno
1
@jsbueno 我已经阅读了你的回答。我来自C语言家族,所以对于像Python这样的动态语言,我仍然不理解它们的所有特性。 - coredump
2个回答

41

Python不需要像“语言扩展”这样的东西,就能以面向方面的方式工作。

这仅仅是由于Python本身的动态机制。通过谷歌搜索可得,会有几个项目-但尽管看起来只是库,但在Python中这就足够了。

我并没有撒谎-这是事实,你可以检查类和方法,并在运行时更改它们。当我第一次了解面向方面编程时,我可以在Python中实现一些概念证明,只需要几个小时的时间-当然,现有的一些项目可以提供生产质量的条目。

但既然你问了,有一种类似于Python“语言扩展”的东西可以用于面向方面编程:当我做上述概念验证时,我使用运行时检查方法的输入参数,以确定是否应将某些方法受到规则的影响。

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

顺便说一下,这是我快速使用纯Python使用面向方面编程的示例。抱歉-代码注释是pt_BR- https://github.com/jsbueno/metapython/blob/main/aspect.py


1
@gnychis:完成了。我通常喜欢我的东西“共享同样”,所以我将LGPL_v3附加到整个存储库中。由于您仅对AOP示例表现出兴趣,因此我将其保留为MIT,这样您就不会受到任何限制。如果您需要其他内容,请随时提出要求。(如果您有一个项目可以使用它,我可能想要搭档升级为完整的Python模块) - jsbueno
1
加油,非常感谢@jsbueno!我肯定会用它来做一个项目。我发现它是一个很好、简单的实现,而许多其他AOP库则过于复杂。 - gnychis
1
@jsbueno 我知道你可以在运行时拦截调用,而不需要显式地使用装饰器。我的错,我以错误的方式阅读了问题 -_-.....我刚刚意识到你写了“Python不需要语言扩展来实现AOP”,这是完全正确的。我以为你写了“Python不需要AOP”,这就是我所争论的(处理横切关注点的目的)。我会给你的答案点赞。 - LVB
2
截至2021年2月19日,代码存储桶链接无法使用。如果有人能在答案中添加示例代码,那将会很有帮助。 - Chris Rudd
1
在Python中进行面向方面编程的特性包括方法装饰器、类装饰器和元类,因为它们在所有其他代码之前运行,并且可以利用Python的动态内省/反射能力来实现高级功能。 - aoeu256
显示剩余8条评论


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