@zikzak: Was bedeutet denn „funktioniert […] nicht”? Erstellst Du ein Objekt, rufst darauf dann `load() auf und erwartest das die Zuweisung an den *lokalen* Namen `self` irgendwie auf magische Weise das Objekt durch etwas anderes ersetzt? So funktionieren Zuweisungen in Python nicht. Du bindest einfach nur den lokalen Namen an einen anderen Wert als das Argument was der Methode übergeben wurde. So eine Zuweisung wirkt sich immer nur auf den Namen aus, nie auf ein Objekt was *vorher* mal an diesen Namen gebunden war.
Du brauchst eine statische Methode (`staticmethod()`) die man auf der Klasse aufrufen kann ohne das man dafür vorher ein Exemplar davon erstellen muss. Und das was Du „Klassenfunktion” nennst ist eine Methode. Manchmal sagt man auch Instanzmethode dazu. Es ist auch keine Klassenmethode (`classmethod()`).
Noch ein paar Anmerkungen zu den Quelltextschnippseln: Die Namen halten sich teilweise nicht an den
Style Guide for Python Code und teilweise sind sie falsch.
`file` bei den `save*()`-Varianten ist keine Datei sondern ein Datei*name*. Zudem ist `file` der Name eines eingebauten Datentyps. Das könnte also zu Verwirrung beim Leser führen wenn man den für etwas anderes verwendet.
`setDirectory()` ist falsch weil da augenscheinlich gar nichts gesetzt wird. Dazu bräuchte es ein Argument auf *was* das Verzeichnis gesetzt wird. Das sieht eher nach einer `get*`-Funktion aus. Das gleiche gilt später für `getFile()`. An der Stelle kann man übrigens auch ein Entwurfsproblem vermuten, solange die beiden Funktionen nicht irgendwelche ”festen” Werte aus einer Konfigurationsdatei oder so ähnlich liefern. Aber selbst dann sollte man das aus Gründen der Flexibiltät ausserhalb der Funktion oder Methode ermitteln und als Argument übergeben.
Pfade setzt man mit nicht mit ``+`` und ``'/'`` sondern mit `os.path.join()` zusammen.
`pickle.dump()` wird unter normalen Umständen niemals einen `csv.Error` auslösen, das macht also absolut keinen Sinn diese Ausnahme dort zu behandeln. Zudem hat `sys.exit()` dort nichts zu suchen. Solange der Code nicht ganz eng zum Hauptprogramm gehört sollte er nicht einfach das gesamte Programm abbrechen dürfen. Das nimmt dem Code der die Speichern-Methode oder -Funktion aufruft jede Möglichkeit anders auf einen Fehler zu reagieren.
Abkürzungen die nicht allgemein bekannt ist, machen Namen unverständlich. Was ist `ag`? Kann man dafür nicht einen für den Leser verständlicheren Namen finden?
`agklasse` bei `saveag()` ist falsch weil dort ganz bestimmt keine Klasse übergeben wird sondern ein Objekt das aus der Klasse erstellt wurde. Da Klassen in Python auch Objekte sind die man wie andere auch als Argumente übergeben kann, ist der Name an der Stelle irreführend.
Wenn man ``with`` für die Dateien verwendet, dann braucht man kein `close()` mehr aufrufen. Das ist ja gerade der Sinn von ``with``, dass wenn der Kontrollfluss den ``with``-Block verlässt, aus welchem Grund auch immer, die Methode zum „aufräumen” der Ressource aufgerufen wird.
Die Fehlerbehandlung ist auch beim Speichern unpassend. Den Benutzer informieren dass etwas nicht geladen werden konnte, und dann einfach so weitermachen als wäre nichts passiert, ist keine gute Idee. Wenn der Aufrufer wissen möchte, dass das Laden fehlgeschlagen ist, hat er nicht die Ausnahme sondern muss den Rückgabewert prüfen. Dieses auf spezielle Rückgabewerte prüfen soll ja gerade durch Ausnahmen ersetzt werden. Dafür wurden die mal erfunden. Der Rückgabewert wird im Fehlerfall noch nicht einmal explizit gemacht. Da fragt man sich als Leser ob das Absicht war oder ob der Programmierer an diesen Fall überhaupt nicht gedacht hat.
Edit: Noch ein Nachtrag zu `pickle`: Für längerfristige Persistenz sollte man sich sicher sein, dass sich in Zukunft nichts an den Datentypen ändert die man damit speichert, sowohl was die Klassen selber angeht, als auch in welchem Packages/Modulen die sich befinden. Denn wenn sich inkompatible Änderungen ergeben, kann man die alten Daten natürlich nicht mehr laden. Relativ sicher vor so etwas ist man wenn man sich auf Python-Grunddatentypen beschränkt. In dem Fall ist man aber schon ziemlich in der Nähe von JSON, wofür es in der Standardbibliothek das `json`-Modul gibt. JSON hat den Vorteil das es für das Format Bibliotheken/Unterstützung auch in sehr vielen anderen Programmiersprachen gibt.