Python でデコレートされているメソッドを取得する方法

Python でデコレーターでデコレートされている関数/メソッドを全て取得したい。

class Sample(object):
    @decorator
    def foo(self):
        pass

    @decorator
    def bar(self):
        pass

    def baz(self):
        pass

この場合だと、foo(), bar() を取得したい。


inspect.getmembers() を使う。

for func_name, func in inspect.getmembers(instance, inspect.ismethod):
    print(func)

instance には Sample クラスのインスタンスが入っている場合、func に Sample のメソッドが格納される。
このままでは baz() まで取得される。
そのためデコレーターの実装に少し工夫する。

def decorator():
    def _decorator(f):
        f.__sample_event = True 
                    
        @wraps(f)
        def __decorator(func, message, **_kwargs):
            return f(func, message, **_kwargs)
                    
        return __decorator

    return _decorator

instance = Sample()
for func_name, func in inspect.getmembers(instance, inspect.ismethod):
    if getattr(func, '__sample_event', False):
        print(func)

ちょっとトリッキーだけど、これでメソッド一覧を取得できる。