Anfängerfragen zum Thema Klassen!

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
search
User
Beiträge: 67
Registriert: Donnerstag 24. April 2008, 10:03
Wohnort: In Deutschland

Freitag 27. März 2009, 23:56

Hallo zusammen, habe da ein paar Fragen zum Thema Klassen Daten in Python. Bin gerade erst dabei mich in die Sache einzulesen, deshalb bitte ich um Nachsicht!! :lol:

Folgendes Problem: Ich habe eine Klasse die Daten von z.B. Personen entgegen nimmt. Diese Daten will ich nun mit >shelve in eine Datei speichern, so weit so gut. Aber wie kann ich die wieder auslesen, oder mache ich da einen Denkfehler? Hier mein bisheriger Code:

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: utf-8 -*- entspricht unicode

import shelve

class Person:
    def __init__(self,  name,  job):
        self.name = name
        self.job = jo
    def info(self):
        return (self.name,  self.job)

#Die Daten
mark = Person('ml',  'trainer')
dave = Person('da',  'developer')

#Datei öffnen und Datenschreiben
object = Person
dbase = shelve.open('filename')
dbase['key'] = object
dbase.close()

#Datei öffnen zum lesen
dbase = shelve.open('filename')
object = dbase['key']
So, und wie komme ich nun an die daten wieder heran? Muss ich die jetzt über >object auslesen oder was???? :?
Danke für eure Hilfe.
Gruß
Stefan
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Samstag 28. März 2009, 00:41

Jop, `object` ist hier eine Instanz der Klasse `Person`. Wobei du `object` niemals als Variablennamen verwenden solltest - so wie jeden anderen `builtin`-Namen auch nicht.
Benutzeravatar
cofi
Moderator
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Samstag 28. März 2009, 01:15

Dauerbaustelle hat geschrieben:Jop, `object` ist hier eine Instanz der Klasse `Person`.
Falsch. Mit dem gezeigten Code erstellst du nur eine Referenz auf die Klasse, nicht auf eine Instanz.
Dazu kommt, dass du mit Python <3 deine Klassen von `object' erben lassen solltest. Noch dazu dürfte recht viel krachen, wenn du `object' überschreibst - hmm mal testen :twisted:

Da du schon Instanzen deiner Klasse erstellst, solltest du die dann auch an dein shelve geben um die Wieder auszulesen ;)

Code: Alles auswählen

mark = Person('ml',  'trainer')
dave = Person('da',  'developer')
dbase = shelve.open('filename')
dbase['mark'] = mark
dbase['dave'] = dave
dbase.close()
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Samstag 28. März 2009, 09:53

cofi hat geschrieben:
Dauerbaustelle hat geschrieben:Jop, `object` ist hier eine Instanz der Klasse `Person`.
Falsch. Mit dem gezeigten Code erstellst du nur eine Referenz auf die Klasse, nicht auf eine Instanz.
Gnaaa, dass er nicht mal instanziert, habe ich jetzt einfach nicht erwartet.
cofi hat geschrieben:Da du schon Instanzen deiner Klasse erstellst, solltest du die dann auch an dein shelve geben um die Wieder auszulesen ;)
Das tut er doch:

Code: Alles auswählen

dbase = shelve.open('filename')
dbase['key'] = object
dbase.close()
Benutzeravatar
cofi
Moderator
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Samstag 28. März 2009, 10:07

Ich seh da nur, dass er die Klasse in das shelve steckt ...
Python bestätigt mich da, wenn ich danach `object.info()' aufrufe

Code: Alles auswählen

Traceback (most recent call last):
  File "test.py", line 26, in <module>
    print object.info()
TypeError: unbound method info() must be called with Person instance as first argument (got nothing instead)
search
User
Beiträge: 67
Registriert: Donnerstag 24. April 2008, 10:03
Wohnort: In Deutschland

Samstag 28. März 2009, 10:16

Hallo,
erst mal Danke für die schnellen Antworten!!
@cofi, ich habe das so gemacht wie du geschrieben hast, aber wenn ich jetzt zum lesen der Datei folgendes mache:

Code: Alles auswählen

dbase = shelve.open('filename')
mark = dbase['mark']
print mark
dbase.close()
bekomme ich bei der >print Anweisung nur einen Fehler!!?? :shock:
Aber wo ist denn nun mein Fehler wieder oder spinne ich jetzt komplett? :cry:
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Samstag 28. März 2009, 10:17

Mögest du möglicherweise in Betracht ziehen, den Fehler hier mitzuteilen? Dann müssten wir nicht Brute-Forcen.
search
User
Beiträge: 67
Registriert: Donnerstag 24. April 2008, 10:03
Wohnort: In Deutschland

Samstag 28. März 2009, 10:21

Sorry, vergessen:
Das untersuchte Programm erzeugte die Ausnahme unhandled AttributeError
"'module' object has no attribute 'Person'"
Datei: /usr/lib/python2.5/shelve.py, Zeile: 113
[/code]
Benutzeravatar
cofi
Moderator
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Samstag 28. März 2009, 10:25

Dann poste mal das ganze Programm, denn http://paste.pocoo.org/show/109977/
macht keine Probleme.
search
User
Beiträge: 67
Registriert: Donnerstag 24. April 2008, 10:03
Wohnort: In Deutschland

Samstag 28. März 2009, 10:29

Hallo cofi,
brauch ich nicht, ist genauso wie deine Kopie!!!

Wenn ich dein Programm (ich habe es kopiert) bei mir laufen lasse, dann kommt dieser Fehler:
Das untersuchte Programm erzeugte die Ausnahme unhandled error
"db type could not be determined"
Datei: /usr/lib/python2.5/anydbm.py, Zeile: 80
BlackJack

Samstag 28. März 2009, 11:03

@search: Dann gab es die Datenbank schon bzw. eine Datei mit dem Namen, die eben keine `shelve`-Datenbankdatei war und deswegen dafür nicht benutzt werden kann.

Bitte in Zukunft den ganzen Traceback zeigen und nicht nur diese drei Zeilen.
search
User
Beiträge: 67
Registriert: Donnerstag 24. April 2008, 10:03
Wohnort: In Deutschland

Samstag 28. März 2009, 11:31

@BlackJack
Also ich habe hier als IDE den >Eric!! habe mich so ein bischen daran gewöhnt, und als Fehlermeldung kommt da nur so ein kleines Fenster. Schon möglich das man sich da auch noch mehr anzeigen lassen kann, muss ich erst mal testen.
BlackJack

Samstag 28. März 2009, 12:05

@search: Nur diese kurze Fehlermeldung ist zur Fehlersuche ungeeignet. Es interessiert einen ja nicht nur der Punkt wo es tatsächlich gekracht hat, vor allem wenn der tief in irgendwelchen Bibliotheken sitzt, die man gar nicht selber geschrieben hat, sondern der gesamte Aufrufweg inklusive der Quelltextzeile im eigenen Programm, wo der Fehler angestossen wurde. Denn *dort* wird man den Fehler gemacht haben und dort muss man ihn auch beheben.
Antworten