所以我想弄清楚我想做的事情是否可能。我正在为一个应用程序编写一些测试代码,并且我有一些对象,它们包含表示我们在产品接口中的一些元素的属性。我想做的是能够将应用程序运行器和数据对象传递给一个新类,并让它根据数据对象中的属性子集动态生成一组访问器属性。到目前为止我的想法:
- 创建属性的子类,该子类包括从接口提取额外信息所需的元数据
- 重构现有的数据对象以使用UI中相关字段的新属性子类
- 创建一个新的生成器类,该类接受UI驱动程序对象和
- 反映数据对象以获取其所有属于新属性子类类型的成员的列表
- 基于属性子类中的元数据将UI中的信息存储到生成器类实例的成员(计划使用
setattr
) - 在运行时创建属性,使在(b)中创建的成员只读,并提供与现有代码一致的接口(即使用
.[name]
而不是.[name]()
)
除了步骤3c,我想我已经把所有的事情都想好了。有没有一种方法可以在运行时动态创建属性?如有任何帮助,我们将不胜感激。
不确定这是您想要的。但是您可以使用getattr和setattrclass X(object):
data = {'x' : 123, 'y' : 456}
def __getattr__(self, name):
if name in self.data:
return self.data[name]
raise AttributeError(name)
def __setattr__(self, name, value):
if name in self.data:
return None
return super(X, self).__setattr__(name, value)
a = X()
print a.x, a.y
a.x = 0
print a.x