2012-11-30 12 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' нет связи с' burb'. Вы просто создаете новый словарь, устанавливаете значения, а затем ничего не делаете с этим новым словарем. – 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" 
Смежные вопросы