在java或c#中有装饰器,如python functools装饰器,即@wraps

时间:2018-06-08 10:05:25

标签: java c# python-decorators

装饰器是Python的重要组成部分。简单来说:它们是修改另一个功能的功能的功能。它们有助于缩短我们的代码。

例如:

def greet(name):
   def get_message():
       return "Hello "

result = get_message()+name
return result

print greet("John")

# Outputs: Hello John

我们可以使用python函数装饰器在上面的代码中更简单,更轻松地完成工作:

 @greet
 def get_message():
     return "Hello"

我认为装饰器非常有用。在java或c#中有类似的东西吗?我知道@override等,但我找不到类似python的装饰器。

1 个答案:

答案 0 :(得分:1)

在Java中没有等同于装饰器。

据我了解,Python中的装饰器本质上是方法转换的语法糖。例如(来自PEP 318):

def foo(cls):
    pass

foo = synchronized(lock)(foo)
foo = classmethod(foo)

成为这个:

@classmethod
@synchronized(lock)
def foo(cls):
    pass

这种事情在Java中不起作用,因为Java方法不是第一类对象,Java方法和方法名之间的绑定是不可变的。

使用注释驱动的代码Java源代码或字节码重写等等,您可以使用Python装饰器做一些事情。但是,以这种方式实现的装饰器应该被视为Java语言的一部分。 (就像Lombok-ified Java不是真正的Java一样。)