Trabajando en Diccionario de las clases en Python
-
25-09-2019 - |
Pregunta
En este ejemplo, tengo un diccionario, que cuando llamo en él, se muestra "Ember Ataque".
#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()
Sin embargo, cuando comienzo a utilizar estantes en lugar del diccionario, aparece un espacio en blanco cuando llamo en 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()
La única diferencia es que hice dict1 una estantería diccionario en lugar de un diccionario tradicional. Probablemente tiene que ver con el alcance de memoria o algo así. De todos modos, ¿Puede alguien ayudarme revisar mi código para que se trabajará con los estantes? Gracias!
Solución
dict1=shelve.open("shelve.dat", writeback=True)
También puede especificar el protocolo que debería mejorar el rendimiento
dict1=shelve.open("shelve.dat", protocol=2, writeback=True)
Debido a la semántica de Python, un estante no se puede saber cuando un mutable entrada-diccionario es persistente modificado. Por objetos modificada por defecto están escritos sólo cuando asignado a la estante (véase el ejemplo). Si el opcional reescritura parámetro se establece en True, todas las entradas que se accede también se almacenan en caché en la memoria, y escrito de nuevo en sincronización () y cerca(); esto puede hacer que sea más práctico a mutar entradas mutables en el persistente diccionario, pero, si muchos Se accede a las entradas, que puede consumir vastas cantidades de memoria para la memoria caché, y puede hacer que la operación de cierre muy lento ya que todas las entradas que se accede se escribe de nuevo (no hay manera de determinan qué entradas son accedidos mutables, ni cuáles eran en realidad mutado).