GObject (GLib Object System) は、GTK+ のすべてのウィジェットおよび関連するオブジェクトの基底クラスからなるオブジェクトシステムと、言語間の透過的相互運用性を提供するライブラリです。GObject は C 言語で実装されており、バインディングによって他の言語から利用可能となっています。
PyGObject は GObject へのバインディングを提供する Python パッケージです。
Python のクラスメソッド
Python でインタンス化していないクラスからメンバーのメソッドを実行したいときには、メソッドに @classmethod というデコレーションを付けます。このときメソッドの第一引数には self でなくクラスそのものである cls を使います。
クラスをインスタンス化せずに使いたい場合とはどんなときでしょう?
例として PyGObject の Gtk.FileChooserDialog を取り上げます。ファイルを選択するダイアログでスタティックメソッドを用いる目的は、クラスに前回選択したファイルがあるディレクトリを記録させておくためです。もちろん、アプリケーション側でディレクトリの場所を記録しておくこともできるのですが、クラス側で管理した方が楽な場合もあります。毎回ファイルを選択するダイアログのクラスをインスタンス化すると、前回開いたディレクトリをインスタンス内で自己参照できないのでクラスメソッドを利用しました。
以下に例を示しました。
/home/bitwalk/venv/bin/python /home/bitwalk/プロジェクト/PyGObject_samples/gtk_filechooserdialog_2.py ファイル「/home/bitwalk/プロジェクト/PyGObject_samples/gtk_filechooserdialog_2.py」が選択されました。 ファイル「/home/bitwalk/プロジェクト/PyGObject_samples/gtk_filechooserdialog_3.py」が選択されました。 Process finished with exit code 0
仮に、同じロジックを使って、普通にインスタンス化したらどのようになるかを確認できるサンプルも以下に用意しました。
インスタンス化すると同じロジックでは前回開いたディレクトリの場所を保持できないことを確認できます。
GUI アプリケーションをどのように作るかは考え方次第です。いろいろなクラスのインスタンスからファイルを開くダイアログを頻繁に使うアプリケーションを作っていて、前回開いたディレクトリを記録しておかないと操作性が悪くなるので、アプリケーション側で記録させようとしたところ、意外と手間がかかって面倒でした。事前にしっかり設計をしないからだと言われればそうなのですが、そんな時にクラスメソッドの有用性に気づいたので備忘録としてまとめました。
参考サイト
にほんブログ村
0 件のコメント:
コメントを投稿