0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

クラスの関数に対して、selfを自分でバインドしなきゃいけなかったからしてみた

Last updated at Posted at 2024-11-27

前置き

クラス内のすべての関数名を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
0
0
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?