Вот кое-что, что может работать как есть, и если нет, то, надеюсь, укажет вам правильное направление.
class TestData(object):
def __getattr__(self, name):
if name not in ('data1', 'data2', 'data3'):
raise AttributeError("TestData has no %s" % name)
if name == 'data1':
result = self._generate_data('data1')
setattr(self.__class__, name, result)
elif name == 'data2':
result = self._generate_data('data2')
setattr(self.__class__, name, result)
elif name == 'data3':
result = self._generate_data('data3')
setattr(self.__class__, name, result)
return result
def _generate_data(self, data_name):
return data_name * int(data_name[-1])
Класс TestData использует метод __getattr__
для генерации данных в том виде, как они есть.необходимо, и благодаря сохранению сгенерированной даты обратно в класс (а не в экземпляр!) данные также сохраняются для будущего использования.
class uses_some_data(object):
def __init__(self, func):
self.func = func
def __call__(self, *args, **kwargs):
global test_data
test_data = TestData()
return self.func(*args, **kwargs)
Простой декоратор для установки глобальной привязки имени для test_data
.На самом деле, эта версия декоратора настолько проста, что может быть легко заменена привязкой имени уровня модуля test_data = TestData()
.
@uses_some_data
def testing_test():
print(test_data.data2)
и тестовой функцией.
Если вы неНе похоже на глобальный уровень test_data
, вы можете стать более привлекательным с декоратором и присвоить test_data
самой функции:
class uses_some_data(object):
def __init__(self, func):
self.func = func
def __call__(self, *args, **kwargs):
self.func.test_data = TestData()
return self.func(*args, **kwargs)
В этом случае убедитесь, что ваши функции тестирования ссылаются на себя
@uses_some_data
def testing_test():
print(testing_test.test_data.data2)