Comment pickle vous-même?
Je veux ma classe pour mettre en œuvre Enregistrer et Charger des fonctions qui, tout simplement, faire un cornichon de la classe. Mais apparemment, vous ne pouvez pas utiliser un 'soi' dans le mode ci-dessous. Comment pouvez-vous faire cela?
self = cPickle.load(f)
cPickle.dump(self,f,2)
- Je pourrais pickle la dict, mais je serais incapable de modifier ultérieurement la classe.
- excellent titre, +1 ed
Vous devez vous connecter pour publier un commentaire.
C'est ce que j'ai fait. La mise à jour de la
__dict__
signifie que nous garder de tout nouveau membre variables-je ajouter de la classe et de simplement mettre à jour ceux qui étaient là lors de la dernière pickle avais. Il semble que le plus simple, tout en maintenant la sauvegarde et le chargement de code à l'intérieur de la classe elle-même afin de l'appelant code ne fonctionne tout simplement un objet.save().load
etsave
en minuscules python.org/dev/peps/pep-0008/#function-namesmerge
. Vous devriez appelerself.__dict__.clear()
avant d'appelerself.__dict__.update(..)
Le dump partie devrait fonctionner comme vous l'avez suggéré. pour le chargement de la partie, vous pouvez définir un @classmethod qui charge une instance à partir d'un fichier donné et le renvoie.
ensuite, l'appelant aurait faire quelque chose comme:
Si vous voulez avoir votre classe de mise à jour de lui-même à partir d'un sauvés cornichon... vous devez utiliser
__dict__.update
, comme vous l'avez dans votre propre réponse. C'est un peu comme un chat chassant sa queue, mais... comme vous le demander à l'instance de l'essentiel "reset" avec l'état antérieur.Il y a un petit tweak pour votre réponse. Vous pouvez réellement pickle
self
.J'ai utilisé
loads
etdumps
au lieu deload
etdump
parce que je voulais le cornichon pour enregistrer une chaîne. À l'aide deload
etdump
à un fichier fonctionne également.Et, effectivement, je peux utiliser
dill
à pickle une instance de classe dans un fichier, pour les utiliser plus tard... même si la classe est définie de manière interactive. Continuant à partir de ci-dessus...puis arrêt et redémarrage...
Je suis en utilisant
dill
, qui est disponible ici: https://github.com/uqfoundationIl est un exemple de la façon de pickle une instance ici, dans les docs. (Recherche vers le bas pour le "TextReader" par exemple). L'idée est de définir
__getstate__
et__setstate__
méthodes qui vous permettent de définir quelles données doivent être traitées, et comment utiliser ces données pour ré-instancier l'objet.Comment sur l'écriture d'une classe Sérialisable la mise en œuvre de décharge et de charge et faire de votre classe hérite d'elle?