Python では、これを行うことはできません。を使用して、クラスの名前空間にアクセスできますlocals()
。しかし、この時点では、関心のある変数をデコレーターに渡すだけでも構いません。
# using locals()
def decorator(class_namespace):
def _decorator(func):
class_namespace["decorated"].append(func)
return func
return _decorator
class A:
store = decorator(locals())
decorated = []
@store
def func(self):
pass
del store
一般に、一対のデコレーターを使用するのは簡単です。1 つは興味のある機能をマークするためのもので、もう 1 つはそれらを収集するためのものです。
from types import FunctionType
def collect(cls):
for item in vars(cls).values():
print(item)
if isinstance(item, FunctionType) and getattr(item, "marked", False):
cls.marked_funcs.append(item)
return cls
def mark(func):
func.marked = True
return func
@collect
class B:
marked_funcs = []
@mark
def func(self):
pass
しかし、あなたの場合、クラスの最後に一連の関数名を作成する方が簡単かもしれません。例えば。
class C:
def func(self):
pass
func_names = [f.__name__ for f in [func]]