2017-02-23 37 views
1

Я пытаюсь поместить некоторые переменные в контейнер (объект) с помощью цикла.Как добавить параметры к объекту с помощью переменных

Я создал следующий класс

class Box(): 
    pass 

теперь я хочу, чтобы инициализировать класс и добавить переменные из моего текстового файла к нему. Мой текстовый файл выглядит следующим образом:

a = 1 
b = 2 
c = 3 
d = 4 

Я попытался следующий код

vars = Box() 

filename = ('inputfile.txt') 

with open (filename) as f: 
    for line in f: 
     parts = line.split() 
     var_name = str(parts[0]) 
     var_value = parts[2] 
     vars.var_name = var_value 

Я не могу выяснить, почему этот подход не работает.

+1

Есть ли какая-либо особая причина для не использования словаря? – asongtoruin

+0

Итак, что именно вы надеетесь достичь? Даже если код выше чем-то работал, установка 'vars.var_name = var_value' на каждой итерации означает, что значение' vars.var_name' будет повторно переопределено и в конечном итоге достигнет значения, указанного в последней итерации. –

+0

Спасибо за помощь, было много полезных и полезных ответов. –

ответ

2

Я думаю, что вы пытаетесь сделать, это использовать класс в качестве носителя для хранения данных. Как уже говорилось, вы можете использовать словарь. В противном случае вам нужно сделать класс на самом деле что-то:

class Box(): 
    def __init__(self): 
     pass 
    def __getitem__(self, name): 
     return getattr(self, name) 
    def __setitem__(self, name, value): 
     return setattr(self, name, value) 

Затем вы можете использовать почти весь код, как это было:

vars = Box() 

filename = ('inputfile.txt') 

with open (filename) as f: 
    for line in f: 
     parts = line.split() 
     var_name = str(parts[0]) 
     var_value = parts[2] 
     vars[var_name] = var_value 

print(vars.a) 

Почему то, что у вас не работа была уже объяснена barak manos: vars.var_name не использует значение переменной var_name, потому что синтаксис, вызывающий метод класса, не поддерживает эту нотацию (по уважительной причине).

0

Может быть, попробовать что-то вроде

vars[var_name + ''] = var_value 

(Нет питон код)

0

Почему бы вам не использовать SetAttr()?

setattr(Box, "var_name", var_value) 
1

Когда вы

vars.var_name = var_value 

еквивалентный добавление ключа 'var_name' в Словаре vars.__dict__.

Я думаю, что вы хотите достичь, используя setattr. вместо vars.var_name = var_value, используйте:

setattr(vars, var_name, var_value)