繁体   English   中英

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

[英]In Jython, can I make an inline anonymous class that implements a Java interface?

在Java中,我可以说

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

(或类似的东西)声明一个内联的匿名类。 这对于制作事件处理程序或其他回调类型的东西非常有用,在任何合理的语言中, 首先不需要对象拥有它们

我在Jython中面临同样的问题 - 我想定义一个事件处理程序,但我不想构建一个完整的独立类来执行此操作。

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

以下是我原来答案中的背景阅读链接:

阅读: Python是否有类似Java的匿名内部类?

然后,请阅读: Python是否有匿名类?

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

[对原始助手的改进]

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)它(几乎)是匿名的 Python强迫我为多行函数选择一个名称,但它也允许我重用该名称。 因此,只要我立即使用它,我就可以定义多个称为_本地函数。 (使用相同的名称定义第二个函数会使第一个函数无法通过该名称访问。)因此,我没有被迫发明ad-infinitum的唯一名称。

你也可以在装饰器中打包这个模式,我想稍微澄清一下这个意图:

@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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM