如何使用Python在运行时创建属性?

时间:2011-06-30 17:30:38

标签: python reflection properties setattribute setattr

所以我试图弄清楚我想做的事情是否可行。我正在为一个应用程序编写一些测试代码,并且我有一些对象包含代表我们产品界面中的一些元素的属性。我想要做的是能够将应用程序运行器和数据对象传递给新类,并让它根据数据对象中属性的子集动态生成一组访问器属性。我的想法到目前为止:

  1. 创建属性的子类,其中包含从界面中提取额外信息所需的元数据
  2. 重构现有数据对象,以便为UI中的相关字段使用新属性子类
  3. 创建一个新的生成器类,它接受UI驱动程序对象和数据对象
    • 反映数据对象以获取属性的所有成员的列表,这些成员属于新属性子类类型
    • 根据属性子类中的元数据将UI中的信息存储到生成器类实例的成员中(计划使用setattr
    • 在运行时创建属性,使(b)中创建的成员成为只读,并提供与现有代码一致的界面(即使用.[name]代替.[name]()
  4. 我认为除了第3c步之外我已经弄明白了。有没有办法在运行时动态创建属性?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分: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