Чтение из файла и создание экземпляра нового класса на основе ввода файла

#python #file #data-structures

#python #файл #структуры данных

Вопрос:

Я пытаюсь сохранить файл, в котором кодируется идентификатор класса, прочитать файл и вызвать класс, чтобы -> в файлах данные были сохранены как

 id_class:(arguments)
  

затем прочитанный файл будет искать из списка файлов нужный класс для вызова и передачи аргументов.

что-то вроде этого:

 class foo:
        id = 1
    def __init__(self):
        self.attr = 10
    def __str__(self):
            return str(self.attr)


class bar:
        id = 2
    def __init__(self):
        self.attr = 20
    def __str__(self):
            return str(self.attr)


def create_foo():
    return foo

def create_bar():
    return bar

class_dict = {1:create_foo(),2:create_bar()}

class_index = [1,2,1,2,1,1,1,2,2,2,1] #data read from file

class_list = [] #output list containing the newly instanciated bar or foo

for index in class_index:
    c = class_dict[index]
    class_list.append(c)
  

но этот код добавляется в class_list, например foo, но это только один класс, потому что, если я изменю атрибут, он будет изменен во всем списке.

например:

 for classe in class_list:
    print classe,

print "n-------------"
class_list[0].attr = 15

for classe in class_list:
    print classe,
  

вывод:

 10 20 10 20 10 10 10 20 20 20 10 
-------------
15 20 15 20 15 15 15 20 20 20 15
  

и должно быть:

 10 20 10 20 10 10 10 20 20 20 10 
-------------
15 20 10 20 10 10 10 20 20 20 10
  

Ответ №1:

Я изменил оба create метода — в них отсутствовали круглые скобки, без них новые экземпляры объекта не создавались. Кроме того, я изменил class_dict , чтобы он не вызывал create методы, вместо этого я откладываю создание экземпляра до момента class_dict обращения к нему : class_dict[index]() . Измененный код выглядит следующим образом:

 class foo:
    id = 1
    def __init__(self):
        self.attr = 10

class bar:
    id = 2
    def __init__(self):
        self.attr = 20

def create_foo():
    return foo()

def create_bar():
    return bar()

class_dict = {1:create_foo,2:create_bar}

class_index = [1,2,1,2,1,1,1,2,2,2,1] #data read from file

class_list = [] #output list containing the newly instanciated bar or foo

for index in class_index:
    c = class_dict[index]()
    class_list.append(c)

for classe in class_list:
    print str(classe.attr),

print "n-------------"
class_list[0].attr = 15

for classe in class_list:
    print str(classe.attr),
  

Комментарии:

1. там я только что объяснил изменения 🙂

2. Спасибо, я спрашивал себя, как создать экземпляр нового объекта 😉