2012-11-30 48 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"