前置き
クラス内のすべての関数名をKey、関数をValueにした辞書を持ったクラスを作成しなければならなくなった。
selfをバインドしながら上記辞書を作成する方法を備忘録として残しておく。
また、self.関数名でバインドすることもできるが、関数の数だけ KeyとValueのセットを書かなければならないので、今回はその実装方法を採用しない。
もしより良い方法あればご指摘いただけると幸いです
2024/11/28: self.関数名 で良くねというご指摘を受けたので、状況が伝わりやすいようにサンプルコードや記事を修正
やりかた
これだとエラー(当たり前だが)
import inspect
class Sample:
def __init__(self):
func_dic = {}
for func_name, func in inspect.getmembers(self.__class__, predicate=inspect.isfunction):
func_dic[func_name] = func
self.func_dic = func_dic
def print_test(self):
print("hoge")
sample = Sample()
sample.func_dic["print_test"]() # TypeError: print_test() missing 1 required positional argument: 'self'
これでOK
import inspect
from types import MethodType # これが神
class Sample:
def __init__(self):
func_dic = {}
for func_name, func in inspect.getmembers(self.__class__, predicate=inspect.isfunction):
func_dic[func_name] = MethodType(func, self)
self.func_dic = func_dic
def print_test(self):
print("hoge")
sample = Sample()
sample.func_dic["print_test"]() # hoge
sample.print_test() # hoge