gpt4 book ai didi

java - 在 Jython 中,我可以创建一个实现 Java 接口(interface)的内联匿名类吗?

转载 作者:搜寻专家 更新时间:2023-10-31 19:56:51 24 4
gpt4 key购买 nike

在 Java 中,我可以说

Thread t = new Thread(){
public void run(){ // do stuff }
}

(或类似的东西)声明一个匿名类内联。这对于制作事件处理程序或其他回调类型的东西最有用,在任何合理语言中wouldn't require an object to own them首先。

我在 Jython 中遇到了同样的问题——我想定义一个事件处理程序,但我不想为此构建一个完整的独立类。

理想情况下,我只能传递一个 lambda 并完成它,但如果可能的话,我在文档中的任何地方都找不到它。

最佳答案

这是我原来回答的背景阅读链接:

阅读:Does Python have something like anonymous inner classes of Java?

然后,阅读:Does Python have anonymous classes?

最后,阅读这个:Is it possible to create anonymous objects in Python?

[对原始 ANSER 的改进]

Jython 在适当的时候将函数隐式转换为事件处理程序。所以,你可以在你的方法之一中写这个:

def _(self, event):
print 'Cancel button was clicked!'
if self.task is not None:
self.task.cancel()
cancelButton.setOnAction(lambda event: _(self, event))

这种方法提供了匿名内部类的三个理想特征。

(1) 高度本地化。处理程序代码位于分配处理程序的代码旁边。

(2) 它是 self 感知的,这意味着您拥有 self 并且可以访问包含对象的所有成员。

(3) 它(几乎)是匿名的。 Python 强制我为多行函数选择一个名称,但它也允许我重用该名称。因此,只要我立即使用它们,我就可以定义任意多个称为 _ 的本地函数。 (用相同的名称定义第二个函数会使第一个函数无法通过该名称访问。)因此,我不必无限地发明唯一的名称。

您也可以将此模式封装在装饰器中,我认为这稍微阐明了意图:

@LocalEventHandler(self, cancelButton.setOnAction)
def _(self, event):
print 'Cancel button was clicked!'
if self.task is not None:
self.task.cancel()

装饰器实现如下所示:

class LocalEventHandler(object):
'''This decorator turns a local function into a *self aware* event handler.'''

def __init__(self, context, assignHandlerFunc):
self.context = context
self.assignHandlerFunc = assignHandlerFunc

def __call__(self, handler):
self.assignHandlerFunc(lambda event: handler(self.context, event))
return handler

关于java - 在 Jython 中,我可以创建一个实现 Java 接口(interface)的内联匿名类吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12424405/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com