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
будет декорирован дважды!
Как правильно передать декораторы из родительского класса в дочерние?