Die Adressen sollten keine Tulpe, sondern Liste sein !
Code: Alles auswählen
adressen = [['Max', 'Muster', 'Maxstr. 12', '1 Maxhausen', '012345678'],
['Tuxi', 'Tux', 'Tuxstr. 21','2 Tuxhausen', '023456734']]
Code: Alles auswählen
adressen = [['Max', 'Muster', 'Maxstr. 12', '1 Maxhausen', '012345678'],
['Tuxi', 'Tux', 'Tuxstr. 21','2 Tuxhausen', '023456734']]
Neion, das andere, das Modulglobale. Du erstellst darin eine *leere* Instanz von Adressbuch und speicherst sie sofort. Damit wird also ein absolut leeres Adressbuch gespeichert. Das bringt absolut gar nichts.kaytec hat geschrieben:Welches Speichern meinst du jetzt ? Da wo ich 'pass' stehen habe ? Das ist doch nur, damit ich keine Fehlermeldung bekomme. Das so das Speichern nicht geht ist schon klar!
Schau dir doch meine Version an: dort hast du ein weiteres Objekt, die Adresse. In der GUI erstellst du eben so eine Adresse-Objekt und Machst eine Funktion etwa Adressbuch.hinzufuegen(self, adresse), dem du die Adresse hinzufügst und dass dann die Adresse abspeichert.kaytec hat geschrieben:Ich habe jetzt eine neue Adresse in meinem 'Adressbuch_Gui' erzeugt. Die möchte ich jetzt speichern. Das ich sie ausserhalb der Klasse Adressbuch erzeuge wird schon mal falsch sein. WIe mache ich es den nun richtig. Ich muss irgendwie eine neue Adresse hinzubekommen, denn sonnst würde ein Adressbuch, das man mit Daten befüllen kann keinen Sinn machen - oder? Wie füge ich in das vorhandene oder evt. leere Adressbuch nach OOP, denn Daten ein.
Code: Alles auswählen
import pickle
class Adressen(object):
feldnamen = ('Name:','Vorname:', 'Strasse:', 'Ort:',
'Festnetz:', 'Handy:','Arbeit:', 'email:',
'Bemerkung:')
def __init__(self, dateiname):
self.adressen = self.laden(dateiname)
def __iter__(self):
return iter(self.adressen)
def __len__(self):
return len(self.adressen)
def hinzufuegen(self, adresse):
self.adressen.append(adresse)
self.adressen.sort()
def loeschen(self, adresse):
self.adressen.remove(adresse)
self.adressen.sort()
def laden(self, dateiname):
try:
datei = file(dateiname, 'r')
except IOError:
adressen = list()
adresse = list()
adresse.extend(''.join(' ' * len(self.feldnamen)))
adressen.append(adresse)
return adressen
adressen = pickle.load(datei)
datei.close()
return adressen
def speichern(self, dateiname):
datei = file(dateiname, 'w')
pickle.dump(self.adressen, datei)
datei.close()
Code: Alles auswählen
import pickle
class Adresse(object):
def __init__(self, name, vorname, strasse, ort, ...):
self.name = name
self.vorname = vorname
self.strasse = strasse
self.ort = ....
class Adressbuch(object):
def __init__(self, adress_datei):
self.adressen = self.load(adress_datei)
def laden(self, adress_datei):
try:
fp = open(adress_datei, "rb")
except IOError:
return []
else:
return pickle.load(fp)
fp.close()
def speichern(self, adress_datei):
fp = open(adress_datei, "wb")
pickle.dump(self.adressen, fp)
fp.close()
def neue_adresse(self, name, vorname, ...):
self.adressen.append(Adresse(name, vorname, ...))
Gratuliere, sieht ähnlich aus, wie mein Versuch kaytec einen sinnvollen Klassenaufbau zu zeigen.EyDu hat geschrieben:Hier mal ein sinnvoller Aufbau kurz angerissen
Sieht schon besser aus, allerdings denke ich, dass die ``laden`` Funktion die Ausnahmen anders behandlen sollte (hat BlackJack glaube ich schon geschrieben): im Moment ist es einfach so, dass wenn die Datei nicht gefunden wurde, dass dann einfach alle etwaig vorhandenen Adressen in der Klasse gelöscht werden. Schlauer wäre es, in der Ausnahmebehandlung eine andere Ausnahme zu werfen, die dem User sagt: "Hier ist was schief gelaufen, und zwar ...".
Ja, das schon.kaytec hat geschrieben:Das Laden sollte 'nichts' (also nur 'None') zurückgeben - hast du geschrieben! Dies habe ich doch gemacht - oder ?.
Nein, jetzt wird so oder so None ausgegeben - egal ob es eine Datei zum Laden gab oder nicht. Dummerweise bekommt der Nuter der Klasse nicht die Möglichkeit zu unterscheiden, ob die Datei erfolgreich eingelesen wurde oder ob so eine Datei gar nicht existiert. Also solltest du eine Ausnahmen werfen, die besagt, dass die Datei nicht vorhanden ist. Auf diese kann der Nutzer der Klasse dann entsprechend reagieren.kaytec hat geschrieben:Falls jetzt 'none' zurückgegeben wird, kann doch der Benutzer noch gar keine Daten in das Adressbuch eingegeben haben.