pythonで動的にクラスとメソッドをCallする
これはなに?
JavaScriptとかで動的にオブジェクトやメソッドが呼べたりしますが、pythonでも出来たら良いな思ったので調べてみました。
実際に書いてみた
参考にしたQiitaの内容を見て、実際に動作を確認してみました。call_test.py
という名前で書いてみます。コードはこんな感じです。
class Callback(object): def __init__(self, data): self.data = data def wake_up(self): return self.data # 通常の使い方 cb = Callback('test') result = cb.wake_up() print(result) # wake_upを実行 result2 = getattr(cb, 'wake_up')() print(result2) # wake_upは実行されない result3 = getattr(cb, 'wake_up') print(result3) # ここで実行される print(result3()) # クラスを動的に設定 cls = globals()['Callback'] instance = cls('test') result4 = instance.wake_up() print(result4) # wake_upを実行 result5 = getattr(instance, 'wake_up')() print(result5)
実際にプログラムを実行すると意図した通り動作するようでした。
$ python call_test.py test test <bound method Callback.wake_up of <__main__.Callback object at 0x1016bbc88>> test test test
まとめ
動的にクラスやメソッドが呼べると便利な場合もありますが、クセのあるコードにもなるので使うところは注意しながら書いたほうが良さそうですね。
参考にしたサイト
追記
他にも、Pythonで文字列から定義済みクラスのインスタンスを作るというのがありました。勉強になりますね。