OOP-Frage: Eigene Klasse von Sqlite erben lassen?

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
Hellstorm
User
Beiträge: 231
Registriert: Samstag 22. Juni 2013, 15:01

Hallo zusammen,

Ich programmiere mir gerade ein kleines Programm, was eine Datei auf einen Webserver hochladen soll und gleichzeitig in eine SQLite-Datenbank ein „Ablaufdatum“ für die Datei speichern soll. Nach Ablauf der Zeit soll die Datei wieder gelöscht werden. So soll Datenmüll auf meinem Webserver vermieden werden :D

Ich bin gerade an der Datenbank-Funktion, die bis jetzt auch schon ganz gut funktioniert (Er speichert schon und löscht es auch wieder, wenn die Frist abgelaufen ist). Ich wollte nur fragen, ob man das auch besser implementieren könnte.

Ich habe mir jetzt also eine Klasse Database erstellt (ob das jetzt in dem kleinen Rahmen sinnvoll ist, weiß ich nicht, allerdings wollte ich damit mal OOP üben). Jetzt bin ich nur unschlüssig, ob ich diese Klasse von sqlite3 erben lassen soll oder nicht?

Im Moment sieht es (unter anderem) so aus:

Code: Alles auswählen

import sqlite3

class Database(object):
    def __init__(self, databasefile):
        self.database = sqlite3.connect(databasefile)
        self.curs = self.database.cursor()
        self.createtable()

    def close(self):
        self.database.close()

    def createtable(self):
        tblcmd = "CREATE TABLE IF NOT EXISTS files (fileid INTEGER PRIMARY KEY, url TEXT, expire INT)"
        self.curs.execute(tblcmd)
Wäre das jetzt sinnvoller, wenn ich hier sqlite3 erben lassen würde? Das hätte dann doch nur den Unterschied, dass ich statt self.database = sqlite3.connect(databasefile) dann self.database = self.connect(databasefile) schreiben würde, oder? Oder würde mir das irgendeinen Vorteil bringen?


Danke!
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Ich würd's nicht tun. Was du da als Klasse erstellt hast, ist ja auch keine Datenbank, sondern eher eine Zwischenschicht, die anscheined ein paar SQL-Statements so abstrahieren soll, damit man in anderen Programmteilen nur noch diese Abstraktion benutzen muss. Das ist an sich auch eine gute Idee mit dieser Zwischenschicht, aber die eigentliche Datenbank würde ich getrennt von der ganzen Sache lassen.

Mal anders ausgedrückt: Wenn du eine automatische Einparkhilfe für ein Auto als Klasse modellieren würdest, die ein paar Lenk- und Vorwärts- / Rückwärts- / Brems-Befehle durchführt und am Ende des Parkvorgangs den Motor ausschaltet (`.close()` im übertragenen Sinne), würdest du diese Klasse dann von `Auto` erben lassen...?
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Abgesehen von den Design-Problemen: Versuch doch mal von`sqlite3` zu erben ;)

Du wirst auch sonst keine Klasse finden von der du erben kannst, um dein Verhalten zu erreichen.
BlackJack

@Helstorm: In der `createtable()` fehlt für meinen Geschmack ein `self.database.commit()`. Und `cursor` kann man auch ausschreiben. Weder 'o's noch 'r's sind irgendwie knapper als andere Buchstaben, so dass man die unbedingt einsparen müsste. ;-)
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Die Klasse schreit übrigens nach __enter__ und __exit__ Methoden, damit man sie als Context Manager nutzen kann.
Hellstorm
User
Beiträge: 231
Registriert: Samstag 22. Juni 2013, 15:01

Oh, so viele Antworten :D Danke!

Dann werd ich das mal alles durchgehen. Ich bin irgendwie noch dabei zu verstehen, wann man genau etwas vererben soll.. oder was das überhaupt bringt :D

@Blackjack:
Hm, komischerweise braucht der anscheinend kein commit, um eine Tabelle zu erstellen. Das habe ich gemerkt, weil der partout keine Einträge anlegen wollte, eine Tabelle aber ohne Probleme anlegen konnte. Danach habe ich erst gemerkt, dass man bei neuen Einträgen ein commit braucht. Aber vielleicht könnte ich doch mal einen einsetzen.
„curs“ hab ich einfach aus Programming Python abgeschrieben :D, aber du hast schon recht. Das kann man besser ausschreiben.

@DasIch:
Ah, davon habe ich noch nie gehört, das muss ich mir dann mal durchlesen. Danke.
BlackJack

@Helstorm: Erben sollte man wenn es eine bereits bestehende Klasse gibt, die von der Bedeutung her das gleiche ist wie der Typ den man implementieren möchte, nur etwas allgemeiner. Und es sollten auch Attribute von der Basisklasse verwendet werden. Wenn man das nicht tut, dann stellt sich nämlich die Frage warum man überhaupt davon erbt.

Vererbung kommt in Python gar nicht so oft vor, weil man nicht von etwas erben muss, um einen bestimmten „duck type” zu implementieren. Es reicht wenn das Objekt am Ende das erwartete Verhalten besitzt.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

BlackJack hat geschrieben:Vererbung kommt in Python gar nicht so oft vor, weil man nicht von etwas erben muss, um einen bestimmten „duck type” zu implementieren. Es reicht wenn das Objekt am Ende das erwartete Verhalten besitzt.
…wie etwa den Contex Manager Ducktype (ich würde das aber eher Protokoll nennen), der schon angesprochen wurde :)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten