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

2 投票
1 回答
666 浏览
提问于 2025-04-16 20:36

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

  1. 创建一个属性的子类,包含从界面提取额外信息所需的元数据
  2. 重构现有的数据对象,让相关的UI字段使用这个新的属性子类
  3. 创建一个新的生成器类,接受UI驱动对象和数据对象,这个类会:
    • 反射数据对象,获取所有属于新属性子类类型的成员列表
    • 根据属性子类中的元数据,存储来自UI的信息到生成器类实例的成员中(计划使用 setattr
    • 在运行时创建属性,使得在(b)中创建的成员变为只读,并提供一个与现有代码一致的接口(也就是说使用 .[name] 而不是 .[name]()

我觉得除了第3c步之外,其他都想明白了。有没有办法在运行时动态创建属性?任何帮助都将非常感谢。

1 个回答

0

我不太确定这是不是你想要的。不过你可以用getattrsetattr方法来定义一个动态的只读属性。下面是一个例子:

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

撰写回答