@TobiM: In dem Modul wo die `Base` definiert wird sollte `engine` nicht auf Modulebene definiert werden. Das importieren eines Moduls sollte keine Seiteneffekte haben, schon gar nicht das eine Datenbankverbindung geöffnet wird. Ich verstehe auch nicht warum Du das in dem anderen Modul noch mal machst. Das gibt es auch in `base`, da hättest Du das also auch her holen können wie Du das mit `Base` ja auch machst. Aber wie gesagt, das sollte nirgends einfach durch das reine importieren des Moduls passieren.
Die `Base`-Klasse sorgt dafür, dass all die davon abgeleiteten Klassen die ”Magie” besitzen durch Klassenattribute so etwas wie ”Deklarationen” zu erlauben.
Das Schliessen der Sitzung gehört sicher nicht in die `add_entry()`-Methode. Und ich frage immer noch warum Du das Objekt auf so eigenartige Weise *in* der Funktion erzeugen musst/willst, und das nicht einfach *vorher* machst. Du hast alle Informationen.
Die Funktion sollte dann so aussehen:
Code: Alles auswählen
def add_entry(session, obj):
session.add(obj)
session.commit()
Und die aufrufe dann so:
Code: Alles auswählen
add_entry(session, LanghaarKatze(1, "Fluff", 5, 12, 3, 20))
add_entry(session, Labrador(2, "Bello", 15, 3, 4))
Einfach, lesbar, verständlich, keine Magie nötig.
Anmerkungen: Du beziehst Dich in dem Modul auf `none`, das sollte wohl jedes mal `None` heissen.
`__init__()` ist kein Konstruktor sondern eine Initialisierung. Der Konstruktor heisst in Python `__new__()` und wird nur sehr selten verwendet. An der Stelle ist dann eigentlich immer etwas ”magisches” wenn man von der normalen Objekterstellung abweichen will.
Ich sehe auch den Sinn nicht wirklich, denn `Base` sorgt schon für eine `__init__()`. Ja, da muss man dann die Argumentnamen angeben, aber der Lesbarkeit schadet das ja nicht wenn man auch beim erstellen des Objekts weiss was 5, 12, 3, 20 bei einer Langhaarkatze eigentlich bedeuten sollen.
Zudem ist das eher ungewöhnlich die ID anzugeben, denn genau die ist üblicherweise `None` und wird von der Datenbank vergeben.