Skip to main content
 首页 » 编程设计

Python之通过字典改变属性

2025年05月04日18davidwang456

我正在编写一个 python 脚本,用于将各种文件中的数据收集到具有多个属性的对象中。 这些属性中的每一个基本上都可以是“ok”、“bad”或“N/A”。 哪些属性是“N/A”,根据我调用脚本时使用的参数而变化。

我想做的是启动所有这些属性默认设置为“ok”的对象,然后将那些尚未测量的对象设置为“N/A”(由返回 N 列表的函数检查/A-属性)。 (然后我从文件中收集数据以将“坏”的属性设置为“坏”。)

我以为我可以通过字典来做到这一点,但它似乎不起作用/无法访问属性?

class Myclass: 
    def __init__(self, ID): 
        self.ID = ID 
        self.at1 = "ok" 
        self.at2 = "ok" 
        self.at3 = "ok" 
        self.at4 = "ok" 
        # there are a LOT more of these attributes 
 
def foo(unused): 
    for i in range(3): 
        blurb = Myclass(i) 
        unused_dic = {"at1":blurb.at1, "at2":blurb.at2, 
                      "at3":blurb.at3, "at4":blurb.at4} 
        for key in unused: 
            unused_dic[key] = "N/A" 
        print blurb.ID, blurb.at1, blurb.at2, blurb.at3, blurb.at4 
 
unused = ["at1","at3"] # this is returned by another function 
foo(unused) 

这个的输出是:

0 ok ok ok ok 
1 ok ok ok ok 
2 ok ok ok ok 

但我希望并希望:

0 N/A ok N/A ok 
1 N/A ok N/A ok 
2 N/A ok N/A ok 

我哪里做错了,我怎样才能做对?

请您参考如下方法:

你不是在改变实例的属性,只是在字典本身。 python 中的变量不是指针;在一个地方更改字符串不会使更改在其他地方可见。

您可以使用 setattr() 动态更改实例的属性:

def foo(unused): 
    for i in range(3): 
        blurb = Myclass(i) 
        for key in unused: 
           setattr(blurb, key, "N/A") 

但您必须将 blurb 实例存储在某处,可以这么说,上面的代码只是“丢球”。