Если вы можете изменить способ вызова декораторов с
class Foo(object):
@many
@decorators
@here
def bar(self):
pass
до
class Foo(object):
@register(many,decos,here)
def bar(self):
pass
тогда вы можете зарегистрировать декораторы следующим образом:
def register(*decorators):
def register_wrapper(func):
for deco in decorators[::-1]:
func=deco(func)
func._decorators=decorators
return func
return register_wrapper
Например:
def many(f):
def wrapper(*args,**kwds):
return f(*args,**kwds)
return wrapper
decos = here = many
class Foo(object):
@register(many,decos,here)
def bar(self):
pass
foo=Foo()
Здесь мы получаем доступ к кортежу декораторов:
print(foo.bar._decorators)
# (<function many at 0xb76d9d14>, <function decos at 0xb76d9d4c>, <function here at 0xb76d9d84>)
Здесь мы печатаем только имена декораторов:
print([d.func_name for d in foo.bar._decorators])
# ['many', 'decos', 'here']