2013-10-15 29 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'。那麼,我們不會去爭論什麼地方出了問題,而是會知道。 – 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