5

Javaでは、私は言うことができます

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

(またはそれに似たもの)匿名クラスをインラインで宣言します。これは、イベント ハンドラーやその他のコールバックのようなものを作成する場合に最も役立ちます。実用的な言語では、そもそもオブジェクトがそれらを所有する必要はありません

Jython でも同じ問題に直面しています。イベント ハンドラを定義したいのですが、そのためにスタンドアロン クラス全体を構築したくありません。

理想的には、ラムダを渡して完了できるようにするだけですが、これが可能であれば、ドキュメントのどこにも見つかりません。

4

1 に答える 1

6

元の回答からの背景を読むためのリンクは次のとおりです。

これを読んでください: 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
于 2012-11-24T22:41:22.280 に答える