以下是我原始答案的背景阅读链接:
阅读本文: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