Работа над словарем классов в Python - PullRequest
0 голосов
/ 05 августа 2010

Для этого примера у меня есть словарь, при вызове которого отображается «Ember Attack».

#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 словарь полки вместо обычного словаря.Это, вероятно, связано с объемом памяти или что-то.В любом случае, может ли кто-нибудь помочь мне пересмотреть мой код, чтобы он работал с полками?Спасибо!

1 Ответ

1 голос
/ 05 августа 2010
dict1=shelve.open("shelve.dat", writeback=True)

вы также можете указать протокол, который должен улучшить производительность

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

Из-за семантики Python полка не может знать, когда изменяется изменяемая запись постоянного словаря.По умолчанию измененные объекты записываются только при назначении на полку (см. Пример).Если для необязательного параметра обратной записи установлено значение True, все записи, к которым осуществляется доступ, также кэшируются в памяти и записываются обратно в sync () и close ();это может сделать его более удобным для изменения изменяемых записей в постоянном словаре, но, если доступ ко многим записям, он может потреблять огромные объемы памяти для кэша, и это может сделать операцию закрытия очень медленной, так как все доступные записи записываются обратнонет способа определить, какие записи были изменены, и какие из них были видоизменены.

...