2010-08-04 57 views
0

在本例中,我有一本詞典,當我打電話時,會顯示「Ember Attack」。使用Python中的類詞典

#import shelve 
class Pokemon(): 
"""Each pokemon's attributes""" 

def __init__(self): 
    self.id=[] 
    self.var1=[] 
    self.var2=[] 
    self.var3=[] 
    self.var4=[] 
    self.var5=[] 

def __str__(self): 
    showList=['id','var1', 'var2', 'var3', 'var4', 'var5'] 

#dict1=shelve.open("shelve.dat") 
dict1={} 
dict1["Charmander"]=Pokemon() 
dict1["Charmander"].var1="Ember Attack" 
#dict1.sync() 
print dict1["Charmander"].var1 
#dict1.close() 

但是,當我開始使用貨架而不是字典時,我在var1上調用時出現空白。

import shelve 

class Pokemon(): 
"""Each patient's attributes""" 

def __init__(self): 
    self.id=[] 
    self.var1=[] 
    self.var2=[] 
    self.var3=[] 
    self.var4=[] 
    self.var5=[] 

def __str__(self): 
    showList=['id','var1', 'var2', 'var3', 'var4', 'var5'] 

dict1=shelve.open("shelve.dat") 
#dict1={} 

dict1["Charmander"]=Pokemon() 
dict1["Charmander"].var1="Ember Attack" 

dict1.sync() 

print dict1["Charmander"].var1 

dict1.close() 

唯一的區別是我製作了dict1而不是普通的字典。它可能與內存範圍有關。無論如何,有人可以幫我修改我的代碼,以便它可以在貨架上工作嗎?謝謝!

+0

「工作」是什麼意思?你能提供一些關於你希望看到什麼發生以及沒有發生什麼的暗示嗎? – 2010-08-04 22:46:24

+0

使用貨架方法,我希望能夠調用dict1 [「Charmander」]。var1並返回「Ember Attack」。當我現在這樣做時,只返回一個空的'[]'。 – Brian 2010-08-04 23:05:30

回答

1
dict1=shelve.open("shelve.dat", writeback=True) 

你還可以指定這應該提高性能

dict1=shelve.open("shelve.dat", protocol=2, writeback=True) 

因爲Python的語義,架子當可變 持久字典條目是 修改 無法知道協議。默認情況下修改對象 僅在分配給 架子時才寫入(請參閱示例)。如果可選的 回寫參數設置爲True,則所有訪問的條目在內存中也被緩存 ,並在同步() 和close();上寫回。這可以使它更加便利 突變在 持續字典可變的條目,但是,如果許多 條目被訪問時,它可以消耗 大量的內存緩存, 它可以使關閉操作 因爲所有的速度很慢被訪問的條目 被寫回(無法確定哪些訪問的條目是可變的,哪一個實際上是 變異)。

+1

你的第二行代碼有效!非常感謝!!!!!!!!! – Brian 2010-08-04 23:09:44