我正在编写一个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
我做错了什么,我该怎么做?
答案 0 :(得分:4)
您不是仅在字典本身中更改实例上的属性。 python中的变量不是指针;在一个地方更改字符串不会使更改在其他地方可见。
您可以使用setattr()
动态更改实例上的属性:
def foo(unused):
for i in range(3):
blurb = Myclass(i)
for key in unused:
setattr(blurb, key, "N/A")
但是你必须在某处存储 blurb
实例,上面的代码只是'丢球'可以这么说。
答案 1 :(得分:1)
您没有修改blurb
对象。您正在修改unused_dict
的值。
您需要将循环更改为:
for key in unused:
if key in unused_dic:
setattr(blurb, key, "N/A") # set attribute 'key' of object blurb to "N/A"
答案 2 :(得分:1)
我试图采用更面向对象的风格; setattr
函数就是您所需要的:
>>> class Myclass:
def __init__(self, ID):
self.ID = ID
self.at1 = "ok"
self.at2 = "ok"
self.at3 = "ok"
self.at4 = "ok"
def __str__(self):
return str((self.at1, self.at2, self.at3, self.at4))
def unused(self, unused):
for attr in unused:
setattr(self, attr, 'N/A')
print self
>>> unused = ["at1","at3"]
>>> for i in range(3):
m = Myclass(i)
m.unused(unused)
('N/A', 'ok', 'N/A', 'ok')
('N/A', 'ok', 'N/A', 'ok')
('N/A', 'ok', 'N/A', 'ok')