元の回答からの背景を読むためのリンクは次のとおりです。
これを読んでください: Python には、Java の匿名内部クラスのようなものがありますか?
次に、これを読んでください: Python には匿名クラスがありますか?
最後に、これを読んでください: Python で匿名オブジェクトを作成することは可能ですか?
【オリジナルANSERへの改良】
Jython は、必要に応じて関数をイベント ハンドラーに暗黙的に変換します。したがって、メソッドの 1 つの中にこれを書くことができます。
def _(self, event):
print 'Cancel button was clicked!'
if self.task is not None:
self.task.cancel()
cancelButton.setOnAction(lambda event: _(self, event))
このアプローチは、匿名内部クラスの 3 つの望ましい特性を提供します。
(1) 高度にローカライズされています。ハンドラー コードは、ハンドラーを割り当てるコードの隣にあります。
(2) それは自己認識です。つまりself
、含まれているオブジェクトのすべてのメンバーにアクセスできます。
(3) (ほぼ)匿名です。Python では、複数行の関数の名前を選択する必要がありますが、その名前を再利用することもできます。_
したがって、すぐに使用する限り、呼び出されるローカル関数をいくつでも定義できます。(同じ名前で 2 番目の関数を定義すると、その名前では最初の関数にアクセスできなくなります。) したがって、一意の名前を無限に発明することを強制されることはありません。
このパターンをデコレーターにパッケージ化することもできます。これにより、意図が少し明確になると思います。
@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