Python装饰器与Java注释相同,还是带有Aspects的Java?

Is a Python Decorator the same as Java annotation, or Java with Aspects?

Python装饰器是相同的还是相似的,或者根本不同于Java注释,或者像Spring AOP,还是方面J?


python修饰符只是将一个函数传递给另一个函数并用结果替换第一个函数的语法糖:

1
2
3
@decorator
def function():
    pass

句法上的糖分

1
2
3
def function():
    pass
function = decorator(function)

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

nbsp;

Java AOP系统是建立在Java之上的巨大事物,而装饰器只是语言语法,很少有附加的语义,你无法比较它们。


这是一个非常有效的问题,任何同时涉足这两种语言的人都可以得到。我自己花了一些时间在Python上,最近我一直在用Java来加快速度。

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

对于使用了Python装饰器的人来说,"不改变执行流"的压力是显而易见的。Python装饰器虽然与外观和感觉中的Java注释相似,但在引擎盖下是完全不同的。根据用户的需要,它们采用底层并以任何方式将自己包装起来,如果用户选择这样做,甚至可能完全避免运行底层本身。它们取下底层,将它们包裹起来,并用被包裹的底层替换。它们实际上是"代理"底层的!

这与爪哇方面的工作方式非常相似!各个方面本身在其机制和灵活性方面都有很大的发展。但本质上,它们所做的是——采用"建议的"方法(我用的是Spring AOP术语,不确定它是否也适用于AspectJ),围绕它们包装功能,以及谓词和类似项,并用包装好的方法"代理""建议的"方法。

请注意,这些思考是在一个非常抽象和概念的水平,以帮助获得大局。当你开始深入研究时,所有这些概念——装饰、注释、方面——都有相当大的涉及范围。但在抽象的层面上,它们非常具有可比性。

TLDR

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


我以类似的方式使用它们:打开/关闭调试或测试选项。

例如(python decorators):

1
2
3
4
5
6
7
8
9
10
11
12
13
def measure_time(func):
    def _measure_time(*args, **kwargs):
        t0 = time.time()
        ret = func(*args, **kwargs)
        print"time=%lf" % (time.time()-t0)
        ...
        return ret
    return _measure_time


@measure_time
def train_model(self):
    ...

对于Java注释,使用GeNeNoType等可以执行类似的作业或更复杂的作业。