Python装饰器是否与Java注释相同,还是与Java具有方面相同?

Python装饰器是否与Java注释或Spring AOP或Aspect J之类的东西相同或相似,或根本不同?


答案 1

Python装饰器只是语法糖,用于将一个函数传递给另一个函数,并用结果替换第一个函数:

@decorator
def function():
    pass

是句法糖

def function():
    pass
function = decorator(function)

Java注释本身只是存储元数据,您必须有一些东西来检查它们以添加行为。

 

Java AOP系统是建立在Java之上的巨大东西,装饰器只是语言语法,几乎没有语义附加,你不能真正比较它们。


答案 2

这是一个非常有效的问题,任何同时涉足这两种语言的人都可以得到。我自己花了一些时间在python上,最近一直在让自己跟上Java的速度,以下是我对这个比较的看法。

Java注释就是- 只是:注释。它们是标记;有关它们正在标记/注释的基础对象的其他元数据的容器。它们的存在本身不会改变底层的执行流,也不会在底层之上添加某种封装/包装器。那么它们如何提供帮助呢?它们由 - 注释处理器读取和处理。它们包含的元数据可以由自定义编写的注释处理器使用,以添加一些辅助功能,使生活更轻松;但是,再说一遍,它们既不会改变底层的执行流,也不会环绕它们。

“不改变执行流”的压力对于使用过python装饰器的人来说是很清楚的。Python装饰器虽然在外观和感觉上与Java注释相似,但在引擎盖下却大不相同。他们采用底层,并以用户希望的任何方式将自己包裹在它周围,甚至可能完全避免运行底层本身,如果选择这样做的话。他们拿走底层,把自己包裹在它周围,用包裹的底层取代底层。他们有效地“代理”了底层!

现在这与 Aspects 在 Java 中的工作方式非常相似!就其机制和灵活性而言,各方面本身已经相当多样化。但从本质上讲,他们所做的是 - 采用“建议”方法(我在春季AOP命名法中谈论,不确定它是否也适用于AspectJ),围绕它们包装功能,以及谓词等,以及“代理”“建议”方法与包装的方法。

请注意,这些思考是在非常抽象和概念性的层面上,以帮助获得大局。当你开始深入研究时,所有这些概念 - 装饰器,注释,方面 - 都有一个相当复杂的范围。但在抽象的层面上,它们非常相似。

断续器

在外观和感觉方面,Python装饰器可以被认为是类似于Java注释,但在引擎盖下,它们的工作方式与Aspect在Java中的工作方式非常相似。