【发布时间】:2014-01-20 08:51:41
【问题描述】:
import inspect
import functools
def for_all_test_methods(decorator):
def decorate(cls):
for name, value in inspect.getmembers(cls, inspect.isroutine):
if name.startswith('test'):
setattr(cls, name, test_decorator(getattr(cls, name)))
return cls
return decorate
def test_decorator(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
print(func.__name__, args, kwargs)
res = func(*args, **kwargs)
return res
return wrapper
@for_all_test_methods(test_decorator)
class Potato(object):
def test_method(self):
print('in method')
class Spud(Potato):
def test_derived(self):
print('in derived')
现在,如果我创建一个 spud 实例,它继承的 test_method 仍然是修饰的,但它有一个未修饰的方法 test_derived。不幸的是,如果我也将类装饰器添加到Spud,那么他的test_method 会被装饰两次!
如何正确地将装饰器从父类传播到子类?
【问题讨论】:
标签: python inheritance decorator python-decorators