2017-02-03 2 views
0

Ich bekomme diese Ausgabe im interaktiven Modus.Klassen in der Dateiverarbeitung in Python 2.7

class test: 
     def p(self): 
      print 'PP' 

>>> f=open('E:\Python\Roy Progs\Test','w') 
>>> t=test() 
>>> import pickle 
>>> pickle.dump(t,f) 
>>> f.close() 
>>> f=open('E:\Python\Roy Progs\Test','r') 
>>> pickle.load(f).p() 
PP 
>>> f.close() 
>>> 
=============================== RESTART: Shell =============================== 
>>> f=open('E:\Python\Roy Progs\Test','r') 
>>> import pickle 
>>> pickle.load(f).p() 

Traceback (most recent call last): 
    File "<pyshell#14>", line 1, in <module> 
    pickle.load(f).p() 
    File "E:\Python\lib\pickle.py", line 1384, in load 
    return Unpickler(file).load() 
    File "E:\Python\lib\pickle.py", line 864, in load 
    dispatch[key](self) 
    File "E:\Python\lib\pickle.py", line 1075, in load_inst 
    klass = self.find_class(module, name) 
    File "E:\Python\lib\pickle.py", line 1132, in find_class 
    klass = getattr(mod, name) 
AttributeError: 'module' object has no attribute 'test' 

Vom Ausgang ich, dass die Definition der Klasse realisieren (deren Aufgabe wird in der Datei gespeichert ist) in dem RAM in dort zu der Zeit Daten abrufen und damit sein muss. Ich verstehe jedoch nicht, warum das so sein muss, indem ich Objekte in der Datei speichere, speichere ich auch nicht die Klassendefinition?

+0

Fügen Sie keine Bilder von Text ein - fügen Sie den Text selbst ein. –

+0

Danke für den Vorschlag. Ich hoffe, es ist jetzt in Ordnung. –

Antwort

1

Das Beizmodul speichert Klassen nach benannter Referenz. Wenn Sie den Namen oder den Ort der Klassenbeize ändern, wird ein Fehler ausgelöst.

Eine schnelle Darstellung des das kann in den interaktiven sehen:

>>> class test: 
    x = 5 


>>> from pickle import dumps 
>>> dumps(test) 
'c__main__\ntest\np0\n.' # pickle is storing a reference to 'test' 

erfolgreich Beize Last zu nennen, muss die zuvor definierte Klasse der Lage zu finden (die zerstört wird, wenn Sie Neustart im Leerlauf nennen)