这里有一些可以按原样工作的东西,如果不是,希望能指出你正确的方向。
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)