如果你可以改变你调用装饰器的方式
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)
# (, , )
在这里,我们只打印装饰器的名称:
print([d.func_name for d in foo.bar._decorators])
# ['many', 'decos', 'here']