Travailler sur Dictionnaire des classes en Python
-
25-09-2019 - |
Question
Pour cet exemple, j'ai un dictionnaire, que quand je l'appelle là-dessus, « Ember Attack » est affiché.
#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()
Cependant, quand je commencer à utiliser les tablettes à la place du dictionnaire, je reçois un blanc quand je demande à 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 seule différence est que je fait Dict1 un dictionnaire shelve au lieu d'un dictionnaire régulier. Il a sans doute à voir avec la portée de la mémoire ou quelque chose. Quoi qu'il en soit, quelqu'un peut me aider mon code pour réviser qu'il fonctionnera avec des étagères? Merci!
La solution
dict1=shelve.open("shelve.dat", writeback=True)
vous pouvez également spécifier le protocole qui devrait améliorer les performances
dict1=shelve.open("shelve.dat", protocol=2, writeback=True)
En raison de la sémantique python, une étagère ne peut pas savoir quand un mutable entrée persistante-dictionnaire est modifié. Par des objets modifiés par défaut sont écrites uniquement lorsqu'ils sont affectés à la étagère (voir l'exemple). Si l'option paramètre writeback est définie sur True, toutes les entrées accessibles sont également mises en cache dans la mémoire, et écrit avant la synchronisation () et close (); cela peut le rendre plus pratique à muter entrées mutables dans la dictionnaire persistant, mais, si beaucoup les entrées sont accessibles, il peut consommer de grandes quantités de mémoire pour le cache, et il peut faire l'opération de fermeture très lent depuis toutes les entrées accessibles sont réintégrées (il n'y a aucun moyen de déterminer les entrées sont accessibles mutables, ni ceux qui étaient en fait mutée).