yuji0602’s blog

日々思っていることなど。

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で文字列から定義済みクラスのインスタンスを作るというのがありました。勉強になりますね。