2012-11-30 49 views
1

我正在编写一个python脚本,将各种文件中的数据收集到具有多个属性的对象中。 这些属性中的每一个基本上都可以是“好”,“坏”或“不适用”。 其中的属性是“N/A”根据我调用脚本的参数而改变。Python - 通过字典更改属性

我想要做的是默认启动所有这些属性都设置为“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

你的'unused_dic'没有连接到'blurb'。你只需要创建一个新的字典,设置值,然后再对这个新字典做任何事情。 – sloth

回答

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') 
+0

这真的很不错,很优雅!谢谢! – Lastalda

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

我需要2只手,你总是比每个人都快: -/ –

+0

我在德沃夏克上打字,会有所作为吗? :-P –

+0

它只是显而易见:P –

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"