Python 特殊メソッド__call__の便利な使い方

7月 7, 2020

特殊メソッドcallの便利な使い方

関数を引数に指定(関数オブジェクト、関数ポインタ)するような場合、関数オブジェクトを使うと、関数は戻り値でしか値を返せないという欠点があります。
tkinterなどでボタン設置して、ボタンを押した場合に、変数などのデータを返したい場合に、引数に関数を指定しているので、returnしても値が残らないのが問題です。
この問題を解決する方法として、クラスの関数化が存在します。pythonで言うと、特殊メソッド__call__です。
つまり、特殊メソッド__call__を使うと、引数に関数を指定するところにクラスの関数化(つまり自作クラス)を指定して、値を戻るようにすれば(コンストラクタで引数を使って、呼び出し元の変数を指定する)、クラスの関数化の処理の中で変更されたデータがそのまま、呼び出し元のデータとして残ります。
値を戻るようにすれば(コンストラクタで引数を使って、呼び出し元の変数を指定する)、クラスの関数化の処理の中で変更されたデータがそのまま、呼び出し元のデータとして残ります。
C言語のポインタの動作でやれていた処理を、pythonではこのようなやり方で処理していると個人的に思っています。
この際のクラスの関数化の目的は、呼び出し元にデータを返すことなので、クラスのインスタンスに変数を残すことを考えていません。

具体的なサンプルコード

そのうち追加する予定です。いつか、追加することを忘れないようにこのページを作っておきました。githubにコードを公開するのが一番いいのかな?