Seite 1 von 1

cPickle und Objekte von eigenen Klassen

Verfasst: Freitag 9. Januar 2009, 08:28
von Nergal
Hallo,

daß man Objekte von eigenen Klassen pickeln kann weiß ich und das klappt bei einer kleinen Testklasse auch wunderbar. Die Werte und Methoden sind nach dem entpickeln alle noch vorhanden und machen das was sie sollen.

Code: Alles auswählen

class Beispiel:
    def __init__(self):
        self._eins = 1
        self._zwei = 2

    def GetEins(self):
        return self._eins

    def GetZwei(self):
        return self._zwei

    def SetEins(self, Zahl):
        self._eins = Zahl
        return

    def SetZwei(self, Zahl):
        self._zwei = Zahl
        return
Die spätere Klasse wird allerdings um einiges umfangreicher. Die Get- und Set-Methoden gibt es momentan nur zu Testzwecken; wollte nur schauen, ob das Objekt die Methoden behält.

Worum es mir eigendlich geht:
Gibt es gewisse Einschränkungen bzw. häufig auftretende Fehler beim pickeln von Objekten von eigenen Klassen?

Laut der Definition auf python.org sollte das alles so funktionieren, wie ich es brauche:
User-defined classes and their instances: marshal does not support these at all, but pickle can save and restore class instances transparently. The class definition must be importable and live in the same module as when the object was stored.
Wie muss ich den letzten Satz verstehen?
Habe zu Testzwecken die Beispielklasse in einem Modul abgespeichert und in einem Anderen geladen und es funktionierte trotzdem wunderbar.

Verfasst: Freitag 9. Januar 2009, 12:11
von BlackJack
Die ge"pickle"te Klasse muss beim entpickeln in dem Modul stecken, in dem sie war, als das "pickle" erstellt wurde. Die Klassen selbst werden nämlich nicht gepspeichert, sondern nur der Name der Klasse eines Objektes und seine Daten. Um dann beim Ent"pickle"n wieder ein Objekt zu erstellen muss deshalb auf die Klasse unter genau dem Namen zugegriffen werden können.

Und Probleme gibt's natürlich auch, wenn die Klassen in inkompatibler Weise verändert werden und die gespeicherten Daten nicht mehr so recht zum Code passen.

Man sollte sich also schon relativ sicher sein, dass sich an Klassen nicht mehr Grundlegendes ändert, wenn man "pickle" für längerfristig gespeicherte Daten verwendet. In dem Fall würde ich eher zu etwas mehr Arbeit raten und die Serialisierung zum Beispiel mit JSON machen.

Verfasst: Freitag 9. Januar 2009, 12:50
von Nergal
Ah, danke :)

Danke für den letzten Tip, aber es handelt sich nur um eine kurzfristige Speicherung und an den Klassen wird auch nichts geändert.