Die Arbeit an Wörterbuch der Klassen in Python
-
25-09-2019 - |
Frage
Für dieses Beispiel habe ich einen Wörterbuch, dass, wenn ich auf ihn nennen, „Ember Attack“ angezeigt wird.
#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()
Allerdings, wenn ich mit Regalen beginnen anstelle des Wörterbuchs, erhalte ich eine leere, wenn ich auf var1 nennen.
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()
Der einzige Unterschied ist, dass ich gemacht dict1 ein shelve Wörterbuch anstelle eines normalen Wörterbuch. Es hat wahrscheinlich mit Speicherumfang oder etwas zu tun. Wie auch immer, kann mir jemand helfen meinen Code überarbeiten, so dass es mit Regalen funktionieren wird? Dank!
Lösung
dict1=shelve.open("shelve.dat", writeback=True)
Sie können auch das Protokoll angeben, die die Leistung verbessern sollten
dict1=shelve.open("shelve.dat", protocol=2, writeback=True)
Aufgrund der Python Semantik, ein Regal kann nicht wissen, ein veränderliches, wenn persistent-Wörterbucheintrag ist geändert. Standardmäßig geänderten Objekte nur die, wenn zugeordnet sind, geschrieben Regal (siehe Beispiel). Wenn die optionale Writeback-Parameter auf True gesetzt ist, Alle Einträge zugegriffen werden ebenfalls zwischengespeichert im Speicher und auf sync zurück geschrieben () und close (); Dies kann es handlicher mutieren wandelbar Einträge in der Wörterbuch persistent, aber wenn viele Einträge zugegriffen werden, kann es verbrauchen große Mengen an Speicher für den Cache, und es kann die Schließungsoperation machen sehr langsam, da alle Einträge zugegriffen zurückgeschrieben werden (es gibt keine Möglichkeit, bestimmen, welche Einträge zugegriffen wandelbar, noch welche davon waren tatsächlich mutiert).