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

时间:2013-03-11 19:40:39

标签: java python python-decorators java-annotations

Python装饰器是否与Java注释或Spring AOP或Aspect J有相同或相似或根本不同?

4 个答案:

答案 0 :(得分:49)

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

@decorator
def function():
    pass

的语法糖
def function():
    pass
function = decorator(function)

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

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

答案 1 :(得分:7)

这是一个非常有效的问题,任何人都可以同时涉足这两种语言。我自己花了一些时间在python上,最近我已经开始使用Java了,这是我对这个比较的看法。

Java注释 - 只是:注释。他们是标记;关于他们标记/注释的底层对象的其他元数据的容器。它们的存在不会改变底层的执行流程,或者不会在底层的顶层添加某种封装/封装。那他们怎么帮忙?它们由 - 注释处理器读取和处理。它们包含的元数据可以由定制编写的注释处理器使用,以添加一些辅助功能,使生活更轻松;但是,他们再一次,他们不会改变基础的NOR包裹的执行流程。

对于使用python装饰器的人来说,“不改变执行流程”的压力会很明显。 Python装饰器虽然在外观和感觉上类似于Java注释,但却完全不同。根据用户的需要,他们采用底层并以任何方式包裹自己,如果选择这样做,甚至可能完全避免运行底层本身。他们采取底层,围绕它自己包裹,并用包裹的底层替换底层。他们实际上是“代理”潜在的!

现在 非常类似于Aspects在Java中的工作方式!方面本身在机制和灵活性方面都有很大的发展。但是在本质上他们所做的是 - 采用'建议'的方法(我在春天用AOP命名,而且不确定它是否也适用于AspectJ),围绕它们包装功能,以及谓词和喜欢,以及'使用包装的代理''建议'方法。

请注意,这些思考处于非常抽象和概念层面,以帮助我们了解情况。当你开始深入研究时,所有这些概念 - 装饰器,注释,方面 - 都有相当大的范围。但在抽象层面上,它们非常具有可比性。

<强> TLDR

就外观而言,python装饰器可以被认为类似于Java注释,但是它们的工作方式非常类似于Aspects在Java中的工作方式。

答案 2 :(得分:2)

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

例如(Python装饰器):

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注释,使用getAnnotation, etc.可以执行类似的工作或更复杂的工作。

答案 3 :(得分:0)

Python装饰器和Java注释具有相同的语法,但具有两个截然不同的目的!它们不兼容或无法互换!

在最近的项目中,我有必要在python脚本上使用java注释语义,然后我搜索了一种模拟它的方法并发现了这一点:

在Python中,有一个名为“文档字符串”的功能!

无非就是一个特殊的注释行,它必须是模块,类或函数的第一行!

就像注释行一样,您可以使用任何形式的文本。但是在这种情况下,对我而言如此特别的是,它可以被python内省法读取!!

因此它可以像Java注释一样工作,它也需要Java反射来解释和响应从其携带的元数据!

遵循一个简短的示例:

来源a.py

```
def some_function():
    '''@myJavaLikeAnnotation()'''
    ... (my function code) ...
```

源b.py(我必须在其中处理@myJavaLikeAnnotacion()):

import a

for element_name in dir(a):
    element = getattr(a, element_name)
    if hasattr(element, '__call__'):
        if not inspect.isbuiltin(element):
            try:
                doc = str(element.__doc__)
                if not doc == '@myJavaLikeAnnotation()':
                    # It don't have the 'java like annotation'!
                    break

                ... It have! Do what you have to do...  
            except:
                pass

显然,缺点是必须自己解析在“ python java like注解”中使用的所有元数据!