#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. Спасибо, я спрашивал себя, как создать экземпляр нового объекта 😉