Seite 1 von 1

OOP-Frage: Eigene Klasse von Sqlite erben lassen?

Verfasst: Montag 8. Juli 2013, 11:32
von Hellstorm
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!

Re: OOP-Frage: Eigene Klasse von Sqlite erben lassen?

Verfasst: Montag 8. Juli 2013, 12:06
von snafu
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...?

Re: OOP-Frage: Eigene Klasse von Sqlite erben lassen?

Verfasst: Montag 8. Juli 2013, 12:08
von cofi
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.

Re: OOP-Frage: Eigene Klasse von Sqlite erben lassen?

Verfasst: Montag 8. Juli 2013, 13:52
von 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. ;-)

Re: OOP-Frage: Eigene Klasse von Sqlite erben lassen?

Verfasst: Montag 8. Juli 2013, 14:13
von DasIch
Die Klasse schreit übrigens nach __enter__ und __exit__ Methoden, damit man sie als Context Manager nutzen kann.

Re: OOP-Frage: Eigene Klasse von Sqlite erben lassen?

Verfasst: Montag 8. Juli 2013, 15:29
von Hellstorm
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.

Re: OOP-Frage: Eigene Klasse von Sqlite erben lassen?

Verfasst: Montag 8. Juli 2013, 15:49
von 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.

Re: OOP-Frage: Eigene Klasse von Sqlite erben lassen?

Verfasst: Mittwoch 10. Juli 2013, 00:08
von Leonidas
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 :)