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

Posted

技术标签:

【中文标题】java 或 c# 中是不是有装饰器,例如 python functools 装饰器,即@wraps【英文标题】:Are there decorators in java or c# like python functools decorators i.e. @wrapsjava 或 c# 中是否有装饰器,例如 python functools 装饰器,即@wraps 【发布时间】:2018-11-18 08:53:33 【问题描述】:

装饰器是 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 的装饰器。

【问题讨论】:

如果你想解释一下这些装饰器的作用,也许我们可以不用在互联网上查找你的意思就可以回答。 如果您在 C# 或 Java 领域,可能值得链接到或描述装饰器的含义,以便我们知道您在说什么。 有很多不同的东西,这取决于你对这些装饰器的实际目标是什么。对于某些可能存在 1to1 替换(例如,Java 中的 @Override 或 C# 中的 override-keyword),对于其他人,您必须使用 Attribute 或类似的。那么您的具体问题是什么? 这样的问题并不像投票所暗示的那么糟糕。但是,正如您所看到的,这里没有人对 python 装饰器一无所知。因此,一个小例子或至少一个超出“有用”的目标会有所帮助。但是不响应所有的 cmets 真的会杀死它。 - 你会想要研究委托,因为这是相当于“函数作为变量”的 c#。 (注意@ 只是语法糖。) 很高兴您改进了您的问题。现在,如果摆脱所有这些反对票就这么简单.. 【参考方案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 语言的一部分。 (就像龙目岛化的 Java 不是真正的 Java。)

【讨论】:

以上是关于java 或 c# 中是不是有装饰器,例如 python functools 装饰器,即@wraps的主要内容,如果未能解决你的问题,请参考以下文章

python语言中的装饰器详解

Adorner 装饰器

Adorner 装饰器

使用列表而不是装饰器模式?

TypeScript 素描 - 装饰器

关于装饰器设计模式