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')
Теперь, если я создаю окучивать экземпляр test_method
, который он унаследовал остатки оформленных, но у него есть непараметризованный метод test_derived
. К сожалению, если я добавлю декоратор класса на Spud
, тогда его test_method
получит украшенное дважды!распространяющегося класс декораторы к унаследованным классам
Как правильно распределять декораторы из родительского класса на детей?
Это выглядит лучше, чем маршрут, по которому я направлялся. Как вы обрабатываете строку 'super' на python2? – wim
@wim См. Мое редактирование, вы будете использовать 'super (TestDecoType, self)'. –
Но сам не определяется в то время. Использую ли я 'super (TestDecoType, cls)'? – wim