5

在Java中,我可以说

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

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

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

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

4

1 回答 1

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))

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

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

(2) 它是self-aware,这意味着您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
于 2012-11-24T22:41:22.280 回答