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

Cod*_*rer 5 java jython anonymous-class

在Java中,我可以说

Thread t = new Thread(){
    public void run(){ // do stuff }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

dav*_*les 6

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

阅读: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))
Run Code Online (Sandbox Code Playgroud)

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

(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()
Run Code Online (Sandbox Code Playgroud)

装饰器实现如下所示:

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
Run Code Online (Sandbox Code Playgroud)