2015-10-09 5 views
0

Я работаю над программой, которая должна обрабатывать множества связных переменных. Я хочу, чтобы связать их все в класс, так что я могу получить доступ к ним интуитивно ...Создание переменных экземпляра в цикле for

class transition(): 
... 

t1 = transition(stuff_to_initialize) 
retrieve_that_variable = t1.that_variable_in_initialized_stuff 

, но я хотел бы, чтобы иметь возможность объявить мой переменный экземпляр из для цикла:

class transition(object): 
    ''' instance of a transition includes... 
    ''' 
    # order convention for uncertainty terms Cij 
    __order = {'c11': 1, 'c22': 2, 'c33': 3, 'c12': 4, 'c13': 5, 'c23': 6} 
    __vector = {'Rx': 0.0, 'Ry': 0.0, 'Rz': 0.0} 


    def __init__(self, cij=__order, vector=__vector): 
     # Things that a transition instance must specify 
     self.layer_type = 0 

     for item in cij.keys(): 
      self.item = 0   
     for item in vector.keys(): 
      self.item = 0 

но в этом примере после инициализации экземпляра transition у меня есть только переменная экземпляра transition.item.

Можно ли инициализировать переменные экземпляра из списка имен переменных?

+1

Если я понимаю вас, вы хотите назвать эти вещи динамически? Почему бы просто не создать переменную, содержащую копию словарей, которые вы используете для справки? – BlivetWidget

+0

Если я правильно вас понял, это [плохая идея] (http://nedbatchelder.com/blog/201112/keep_data_out_of_your_variable_names.html). – That1Guy

ответ

0

Это плохой способ, но функция, которую вы хотите, это setattr. Вы можете сделать

for item in cij.keys(): 
    setattr(self, item, 0) 

Так что да, вы можете инициализировать переменные экземпляра из списка имен. Трудно понять, почему вы бы не просто использовали словарь в этом случае.

+0

В моем случае я по существу заменяю человека кодом для обработки ввода-вывода для другой простой программы. В более поздний момент мне нужно сгенерировать входные файлы для подпроцесса в определенном формате и, на мой взгляд, иметь возможность захватить соответствующую информацию из 't1 = transition()' ... 't1.value_I_need' делает программу менее зависимой по синтаксису ... пользовательский ввод не нуждается в конкретных ключевых словах для синтаксического анализа, только для корректного инициализации класса. С другой стороны, я самоучкой, поэтому я мог глупо делать то, что делал. Спасибо за ответ! – PetMetz

+0

Как это отличается от 't1 = {} ... t1 ['value_I_need']'? В какой-то момент вашей программы нужно будет ввести имена атрибутов, и очень сложно понять, почему вы не просто сохранили их как ключи в словаре, который отображает их в соответствующие значения. – JoeCondron

Смежные вопросы