2017-02-03 1 views
0

Je reçois cette sortie en mode interactif.Classes dans la gestion de fichiers en 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' 

De la sortie je me rends compte que la définition de la classe (dont l'objet est stocké dans le fichier) doit être là-bas dans la RAM au moment de la récupération de données et de l'utiliser. Je ne comprends pas pourquoi cela doit être le cas, en stockant des objets dans le fichier, je ne stocke pas la définition de la classe aussi?

+0

Ne collez pas d'images de texte - collez le texte lui-même. –

+0

Merci pour la suggestion.J'espère que c'est ok maintenant. –

Répondre

1

Le module Pickle stocke les classes par référence nommée. Si vous changez le nom ou l'emplacement de la classe, le pickle déclenchera une erreur.

Une illustration rapide qui peut être vu dans l'interface interactive:

>>> class test: 
    x = 5 


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

Pour appeler avec succès cornichon de charge doit être en mesure de trouver la classe précédemment définie (qui est détruit lorsque vous appelez le redémarrage au ralenti)