Problem beim "entpicklen" meines Objektes

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
LazyChicken
User
Beiträge: 2
Registriert: Montag 20. November 2006, 21:07

Hallo !

Mein erster Post und ich komme natürlich auch gleich mit einem Python Problem daher ;).

Folgendes: Ich habe um Vererbung zu üben eine Klasse Mitarbeiter und zwei Subklassen Chef und Arbeiter geschrieben.
Nun wollte ich mit Hilfe von pickle meine Instanz der Klassen Chef in einer Datei speichern und wieder laden.
Mit einem print Befehl habe ich dann c (auf dieser Variablen liegt das gepicklete Objetkt) und was ist meine Ausgabe? Folgende:

<__main__.Chef instance at 0x00CF7620>

er zeigt also den Speicherbereich an o_O, finde ich ziemlich komisch, aber ihr wisst da sicher besser bescheid, wenn ihr noch code braucht einfach posten ;) Ciao
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

LazyChicken hat geschrieben:wenn ihr noch code braucht einfach posten ;) Ciao
Ja, bitte...

Was erwartest du denn für eine Ausgabe?

Code: Alles auswählen

>>> class Foo(object):
...  pass
>>> a = Foo()
>>> print a
<__main__.Foo object at 0xa6b1cfec>
>>> a.blubb = 42
>>> import cPickle
>>> pickled = cPickle.pickle(a)
>>> del a
>>> a
NameError: 'a' is not defined
>>> a = cPickle.loads(pickled)
>>> print a.blubb
42
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Was gibt denn "print c" aus, bevor du es pickelst und wieder einliest?
lunar

LazyChicken hat geschrieben: er zeigt also den Speicherbereich an o_O, finde ich ziemlich komisch, aber ihr wisst da sicher besser bescheid, wenn ihr noch code braucht einfach posten
Nö, das ist nicht komisch. Das ist normal. print gibt bei Objekten immer die Speicheradresse und den voll qualifizierten Namen aus, wenn du dieses Verhalten für deine Klasse nicht änderst.

Die Methode, die dahinter steckt, ist __str__(self). Du kannst diese Methode in deiner Klasse überschreiben, um z.B. den Namen des Chefs zurückzugeben:

Code: Alles auswählen

class Chef:
    ...
    def __str__(self):
        return self.name
    ...
Dann gibt der print Befehl den Namen des Chefs aus, wenn du ihn für ein Chef Object aufrufst.

Gruß
lunar
Zuletzt geändert von lunar am Mittwoch 22. November 2006, 16:38, insgesamt 1-mal geändert.
LazyChicken
User
Beiträge: 2
Registriert: Montag 20. November 2006, 21:07

Alles klar danke lunar ;) damit ist meine Frage beantwortet ;)
Antworten