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的主要内容,如果未能解决你的问题,请参考以下文章