Trabalho no Dicionário de Classes em Python
-
25-09-2019 - |
Pergunta
Para este exemplo, eu tenho um dicionário, que quando eu chamar ele, "Um Ataque" é exibida.
#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()
No entanto, quando eu começar a utilizar prateleiras em vez de o dicionário, fico em branco quando eu chamo na 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()
A única diferença é que eu fiz dict1 uma prateleira dicionário em vez de um dicionário regular.Ele provavelmente tem a ver com a memória escopo ou algo assim.De qualquer maneira, alguém pode me ajudar a rever o meu código para que ele funcione com prateleiras?Obrigado!
Solução
dict1=shelve.open("shelve.dat", writeback=True)
você também pode especificar o protocolo que deve melhorar o desempenho
dict1=shelve.open("shelve.dat", protocol=2, writeback=True)
Devido Python semântica, uma prateleira não é possível saber quando um mutável persistente-entrada de dicionário é modificada.Por padrão, os objetos modificados são escritas apenas quando atribuídos ao prateleira (ver Exemplo).Se o opcional escrita parâmetro é definido como True, todas as entradas acessado também são armazenados em cache na memória, e gravados de volta no sync() e close();isso pode torná-lo mais acessíveis para mutação mutável entradas no persistente dicionário, mas, se muitos as entradas são acessados, podem consumir grandes quantidades de memória para o cache, e ele pode fazer a operação de fechamento muito lento, pois todos os acessado entradas são escritas de volta (não há nenhuma maneira para determinar quais entradas são acessados mutável, nem quais foram realmente mutantes).