是的,您可以编写一个类装饰器;下面将允许您装饰类中的每个函数:
def decorate_all_functions(function_decorator): def decorator(cls): for name, obj in vars(cls).items(): if callable(obj): try: obj = obj.__func__ # unwrap Python 2 unbound method except AttributeError: pass # not needed in Python 3 setattr(cls, name, function_decorator(obj)) return cls return decorator
上面的类装饰器将给定的函数装饰器应用于类上的所有可调用对象。
假设您有一个装饰器,该装饰器在打印之前和之后打印要调用的函数的名称:
from functools import wrapsdef print_on_call(func): @wraps(func) def wrapper(*args, **kw): print('{} called'.format(func.__name__)) try: res = func(*args, **kw) finally: print('{} finished'.format(func.__name__)) return res return wrapper然后可以将类装饰器应用于:
@decorate_all_functions(print_on_call)class Foo: def func1(self): print('1') def func2(self): print('2')演示:
>>> @decorate_all_functions(print_on_call)... class Foo:... def func1(self):... print('1')... def func2(self):... print('2')... >>> c = Foo()>>> c.func1()func1 called1func1 finished>>> c.func2()func2 called2func2 finished


