在Java中,我可以说
Thread t = new Thread(){
public void run(){ // do stuff }
}
(或东西很像)申报一个匿名类内嵌。 这是为了使事件处理程序或其它回调各种各样的东西,在任何合理的语言最有用将不要求对象拥有它们摆在首位。
我面对的Jython同样的问题 - 我想定义事件处理程序,但我不希望建立一个独立的整体类这样做。
理想情况下,我只希望能够传递一个lambda,并用它做,但如果这是可能的,我不能在任何地方的文档中找到它。
下面是我原来的答复背景阅读链接:
阅读: 确实的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?