在Jython中,我可以实现的Java接口的联匿名类?(In Jython, can I make

2019-07-31 13:58发布

在Java中,我可以说

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

(或东西很像)申报一个匿名类内嵌。 这是为了使事件处理程序或其它回调各种各样的东西,在任何合理的语言最有用将不要求对象拥有它们摆在首位。

我面对的Jython同样的问题 - 我想定义事件处理程序,但我不希望建立一个独立的整体类这样做。

理想情况下,我只希望能够传递一个lambda,并用它做,但如果这是可能的,我不能在任何地方的文档中找到它。

Answer 1:

下面是我原来的答复背景阅读链接:

阅读: 确实的Python有类似匿名内部类的Java?

然后,阅读这样的: 确实有Python的匿名类?

最后,阅读: 是否有可能在Python中创建匿名对象?

[改进ORIGINAL 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 ,并且可以访问到所有包含对象的成员。

(3)这是(几乎) 匿名 。 蟒蛇迫使我选择多行函数的名称,但它也让我重新使用该名称。 所以,我可以定义为许多称为局部功能_只要我使用它们的时候了。 (同名定义第二功能,使第一功能由该名称无法访问。)所以,我不是被迫去创造独特的名称广告无穷。

您也可以打包在一个装饰,我想澄清的意图有点这种模式:

@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


文章来源: In Jython, can I make an inline anonymous class that implements a Java interface?