2013-10-15 3 views
-1

Я пытаюсь создать экземпляр класса из файла объектов:Создание экземпляров класса из файла в Python

MyCube,2,3,4 
FancyCube,5,3,3 
AngryCube,5,5,5 

, где первая колонка это имя экземпляра.

class cube(object): 
    def __init__(self, X, Y, Z): 
     self.X = X 
     self.Y = Y 
     self.Z = Z 


def filetest(): 
    filename = 'CubeDB.txt' 
    ins = open(filename, 'r') 

    for line in ins: 
     name, X, Y, Z = line.rstrip('\n').split(',') 
     vars()[name] = cube(X, Y, Z) 

filetest() 
print MyCube.X 

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

File "classtest.py", line 21, in filetest 
    vars()[name] = cube(X, Y, Z) 
TypeError: 'str' object is not callable 

Любые мысли? Спасибо

+2

Я думаю, что 'vars' устанавливается в строку где-то над' cube' –

+0

Почему бы не разделить линию на части, чтобы увидеть, какой из двух вызовов функций является повышение? 'c = cube (X, Y, Z)', 'v = vars()' и 'v [name] = c'. Тогда, вместо того, чтобы мы должны _guess_, что пошло не так, вы будете знать. – abarnert

+0

Прежде всего, это плохая идея использовать 'vars()', во-вторых, 'vars()' внутри функции не будет создавать глобальную переменную. –

ответ

1

Как было предложено в комментариях, изменение vars() может быть не лучшим подходом. Я бы предложил создать словарь и использовать имена кубов в качестве ключей. Кроме того, вы можете использовать csv module непосредственно:

import csv 

class Cube(object): 
    def __init__(self, X, Y, Z): 
     self.X = X 
     self.Y = Y 
     self.Z = Z 

def filetest(): 
    filename = 'CubeDB.txt' 
    cubes = {} 
    with open(filename, 'r') as csvfile: 
     for row in csv.reader(csvfile): 
      cubes[row[0]] = Cube(*row[1:]) 
    return cubes 

cubes = filetest() 
print cubes['MyCube'].X 
+0

Спасибо, я не знал, что модуль csv существует. Это решило мою проблему и отлично работает. – user2883778

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