2011-10-24 60 views
1

我試圖存儲一個文件,它對一個類的id進行編碼,讀取文件並調用該類,以便在數據將被存儲的文件中 - > 像基於文件輸入從文件和instanciate新類讀取

id_class:(arguments) 

比讀文件會從文件列表中查找正確的類來invoque並傳遞參數。

是這樣的:

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), 
+0

python的魔力!它工作...但爲什麼? – Pella86

+0

那裏,我只是解釋了變化:) –

+0

謝謝你,我問自己如何instanciate一個新的對象;) – Pella86