如何在运行时用Python创建属性?
我正在尝试弄清楚我想做的事情是否可行。我正在为一个应用程序编写一些测试代码,并且我有一些对象,这些对象包含了我们产品界面中某些元素的属性。我想做的是能够将应用程序运行器和数据对象传递给一个新类,然后让它根据数据对象中的一部分属性动态生成一组访问属性。到目前为止我的想法是:
- 创建一个属性的子类,包含从界面提取额外信息所需的元数据
- 重构现有的数据对象,让相关的UI字段使用这个新的属性子类
- 创建一个新的生成器类,接受UI驱动对象和数据对象,这个类会:
- 反射数据对象,获取所有属于新属性子类类型的成员列表
- 根据属性子类中的元数据,存储来自UI的信息到生成器类实例的成员中(计划使用
setattr
) - 在运行时创建属性,使得在(b)中创建的成员变为只读,并提供一个与现有代码一致的接口(也就是说使用
.[name]
而不是.[name]()
)
我觉得除了第3c步之外,其他都想明白了。有没有办法在运行时动态创建属性?任何帮助都将非常感谢。
1 个回答
0
我不太确定这是不是你想要的。不过你可以用getattr和setattr方法来定义一个动态的只读属性。下面是一个例子:
class 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