もち256ログ
About Note Log
Log
published: 2021-12-25
キー指定で動的にpythonのクラスメソッドを実行する

今回はpythonのクラスに実装された関数を、キーを指定して動的に実行する方法になります。

pythonはインスタンス化したオブジェクトに対し、基本的にhoge.huga()の形式でクラスメソッドを呼び出しますが、hoge["huga"]()の形式で呼び出せるようにします。

また、前回の「pythonのクラスメソッドを異なるファイルで管理する」と組み合わせることも可能です。


実装

パッケージは下記のような配置になります。

myproject内に、クラスが定義されている"some_class.py"を用意します。

myproject
└── some_class.py

クラスの実装は下記になります。

# some_class.py
class SomeClass:
    def some_func(self):
        print("this is some function.")

    def __getitem__(self, key):
        return self.__getattribute__(key)

    def __contains__(self, key):
        return key in dir(self)

    def __setitem__(self, *args, **kwargs):
        raise AttributeError()

"some_func()"が、今回動的に実行したい関数となります。

"__getitem__()"をオーバーライドすることで、インスタンス化したオブジェクトでキーを指定した場合の挙動を変更することができます。
上記の例だと、クラス自身のアトリビュートから、キーに一致する要素をreturnします。

また、"__setitem__()"をオーバーライドすることで、インスタンス外部からキーを追加しようとした際に、例外を発生します。

そして、"__contains__()"をオーバーライドし、クラス自身のアトリビュート内に外部からのキーで指定された要素が存在しているかを返せるようにします。


上記のクラスを実行した際の挙動が、下記になります。

>>> from myproject.some_class import SomeClass
>>> sc = SomeClass()

>>> # in演算子によって、関数の存在を確認できる
>>> "some_func" in sc
True

>>> # 通常の使用方法
>>> sc.some_func()
this is some function.

>>> # キーを指定して関数の実行
>>> sc["some_func"]()
this is some function.

>>> # "__setitem__()"の実装によって、キーを指定して
>>> # 値を追加しようとすると例外が発生する
>>> sc["some_func"]=123
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/myproject/some_class.py", line 12, in __setitem__
    raise AttributeError()
AttributeError

今回のようにクラスを定義すると、キーを指定して動的にクラスメソッドを実行することができます。

例えば、DBに設定されている値によって実行する関数を切り替えたい場合などに役立つのではないでしょうか。

今回は以上となります。
ここまで読んでいただき、ありがとうございました!


ログ一覧へ戻る