2020-06-12

【備忘録】Python のクラスメソッドを理解する

GObject (GLib Object System) は、GTK+ のすべてのウィジェットおよび関連するオブジェクトの基底クラスからなるオブジェクトシステムと、言語間の透過的相互運用性を提供するライブラリです。GObject は C 言語で実装されており、バインディングによって他の言語から利用可能となっています。

PyGObject は GObject へのバインディングを提供する Python パッケージです。

Wikipedia より引用・編集

Python のクラスメソッド

Python でインタンス化していないクラスからメンバーのメソッドを実行したいときには、メソッドに @classmethod というデコレーションを付けます。このときメソッドの第一引数には self でなくクラスそのものである cls を使います。

クラスをインスタンス化せずに使いたい場合とはどんなときでしょう?

例として PyGObject の Gtk.FileChooserDialog を取り上げます。ファイルを選択するダイアログでスタティックメソッドを用いる目的は、クラスに前回選択したファイルがあるディレクトリを記録させておくためです。もちろん、アプリケーション側でディレクトリの場所を記録しておくこともできるのですが、クラス側で管理した方が楽な場合もあります。毎回ファイルを選択するダイアログのクラスをインスタンス化すると、前回開いたディレクトリをインスタンス内で自己参照できないのでクラスメソッドを利用しました。

以下に例を示しました。

gtk_filechooserdialog_2.py
gtk_filechooserdialog_2.py の実行例
PyCharm 上の出力例
/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

仮に、同じロジックを使って、普通にインスタンス化したらどのようになるかを確認できるサンプルも以下に用意しました。

gtk_filechooserdialog_3.py

インスタンス化すると同じロジックでは前回開いたディレクトリの場所を保持できないことを確認できます。

GUI アプリケーションをどのように作るかは考え方次第です。いろいろなクラスのインスタンスからファイルを開くダイアログを頻繁に使うアプリケーションを作っていて、前回開いたディレクトリを記録しておかないと操作性が悪くなるので、アプリケーション側で記録させようとしたところ、意外と手間がかかって面倒でした。事前にしっかり設計をしないからだと言われればそうなのですが、そんな時にクラスメソッドの有用性に気づいたので備忘録としてまとめました。

参考サイト

  1. Gtk.FileChooserDialog - Classes - Gtk 3.0
  2. gtk.FileChooserDialog

 

ブログランキング・にほんブログ村へにほんブログ村

0 件のコメント: