Чтение из файла и создание нового класса на основе ввода файла - PullRequest
1 голос
/ 24 октября 2011

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

id_class:(arguments)

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

примерно так:

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 Ответ

1 голос
/ 24 октября 2011

Я изменил оба метода 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),
...