Eine Datenbank, erstellt mit OOP

17. Juni 2025

Objektorientierte Programmierung (OOP)

Im Rahmen des Ergänzungsfachs Informatik haben wir uns vor einiger Zeit mit objektorientiertem Programmieren auseinandergesetzt. Dabei handelt es sich um einen bestimmten Programmieransatz, bei dem es Klassen, Objekte, Eigenschaften und Methoden gibt. Zur Erarbeitung des Themas haben wir vor allem mit der EF-Informatik-Webseite gearbeitet und uns so das Wissen darüber selbst angeignet. Der Vorteil der OOP-Herangehensweise ans Programmieren liegt darin, dass der Code noch modularer als bei funktionenorientiertem Programmieren wird und den Umgang mit zusammenhängenden Datenstrukturen erleichtert.

Mithilfe sogenannter Klassen können Objekte erstellt werden, welche dann jeweils eigene Eigenschaften und Methoden haben. Diese können dann für das jeweilige Objekt benutzt werden. Klassen bilden also quasi einen Bauplan dafür, wie ein Objekt aufgebaut ist und welche Methoden und Eigenschaften es hat. Beispielsweise könnte eine Klasse Schafe lauten. Jedes einzelne Schaf (Objekt) hätte dann Eigenschaften, die entweder beim Erstellen des Objekts oder sonst gesetzt werden müssten. Soll eine Eigenschaft zwangsläufig beim Erstellen des Objekts definiert werden, gibt es den Konstruktor. Dieser ist eine spezielle Methode, die in der Klasse definiert wird und welche automatisch bei jedem Erstellen eines Objekts aufgerufen wird. Dabei kann man im Konstruktor Parameter angeben, die für die Erstellung eines Objektes dann zwangsläufig mitgegeben werden müssen. Dabei werden dann die Werte der Eigenschaften angegeben, die dann im Konstruktor als Parameter empfangen werden und dann als Eigenschaften für das jeweilige Objekt definiert werden. In der Konstruktor Methode selbst können zudem auch Eigenschaften angegeben werden, die standardmässig für alle Objekte gleichgesetzt sind und nicht bei der Erstellung einzeln mitgeteilt werden müssen. In unserem Schafe-Klasse-Beispiel könnte man dann beispielsweise fordern, dass jedem Schaf beim Erstellen einen Namen und ein Alter angegeben werden muss. Zudem könnte man im Konstruktor selbst definieren, dass jedes Schaf standardmässig die Eigenschaft hat, dass es keinen Hunger hat, jedoch müde ist.
Methoden sind die Funktionen, die für jedes Objekt ausgeführt werden können. Diese müssen jedoch separat im Programmcode aufgerufen werden im Gegensatz zur Konstruktor-Funktion, die automatisch beim Erstellen eines Objekts ausgeführt wird. In Methoden können dann die Eigenschaften automatisch verändert oder neu gesetzt werden. Bezogen auf unser Beispiel mit den Schafen könnte eine Methode dann beispielsweise Schlafen() sein. Wenn diese Funktion dann aufgerufen werden würde, würde die Eigenschaft müde des jeweiligen Schafes auf unwahr gesetzt werden, dafür die Eigenschaft hungrig auf wahr. Eine weitere Methode könnte dann noch heissen Essen(). Diese würde dann die Eigenschaft hungrig eines Schafs wieder auf unwahr setzen.


Programmierung einer OOP-Datenbank

Ein weiteres Thema, das wir im Unterricht behandelt haben, war Datenbanken. Diese haben wir jedoch niemals selbst programmiert. Wir haben gelernt, wie man Datenbanken mit SQL, einer Datenbanksprache, Datenbanken abfragt. Zusätzlich haben wir dabei auch gelernt, wie Datenbanken miteinander agieren. Nun habe ich das Prinzip der Funktionsweise einer Datenbank selbst in einem Python Programm umgesetzt und mit OOP-Struktur programmiert. Dabei ist jeder Datensatz ein eigenes mit einer vordefinierten Klasse erstelltes Objekt. Um einen neuen Datensatz hinzuzufügen, muss ein Objekt erstellt werden und die Parameter müssen dem Konstruktor mitgeteilt werden. Dann wird der Konstruktor ausgeführt und jeder neu erstellte Datensatz wird in eine leere, vorher erstellte einträge Liste hinzugefügt. Um auf die Daten zuzugreifen, muss die Datenabruf() Methode ausgeführt werden. Es würde aber keinen Sinn machen, dass jedes einzelne Objekt diese Methode hätte, um alle Daten aufzurufen. Aus diesem Grund wurde diese Methode als sogenannte Klassenmethode (@classmethod ) umgesetzt. Das heisst, sie kann nicht direkt für jedes Objekt einzeln aufgerufen werden, sondern nur als Methode der Klasse Datenbank (also Datenbank.Datenabruf()). Innerhalb der Methode werden dann für jedes Objekt aus der einträge Liste die Eigenschafts-Werte auf einer Zeile ausgegeben. Mit der Methode Datenabruf(), werden aber immer alle Datensätze ausgegeben. Damit man aber nun Datensätze spezifisch durch deren Werte suchen und filtern kann, gibt es eine weitere Methode namens Suche(). In dieser Methode wird eine weitere leere Liste namens suchergebnisse erstellt. Beim Aufruf dieser Methode muss der Nutzer dann den gesuchten Begriff eingeben, der in den gesuchten Datensätzen enthalten sein sollte. Als nächstes wird geschaut, ob dieser eingegebene Begriff in einer der verschiedenen Eigenschafts-Werte, der Objekte in der einträge Liste vorhanden ist. Sollte dies der Fall sein, wird als nächstes der zutreffende Datensatz in die suchergebnisse Liste hinzugefügt. Wenn dies für alle Objekte überprüft wurde, wird die Datenabruf() Methode von der Suche() aus abgerufen. In dieser wird dann überprüft, ob es eine Suchergebnisliste schon gibt. Ist die suchergebnisse Liste vorhanden, werden in der Ausgabe an den Nutzer dann nur die Datensätze aus dieser Liste ausgegeben. Somit ist die Suchanfrage beendet.
Ich habe dieses OOP-Datenbank-Prinzip für eine Datenbank, bestehend aus fiktiven Schülern umgesetzt und programmiert. Hier der Code.

Bild: Screenshot des Python-Codes meiner selbst programmierten OOP-Datenbank. In der Shell ist zuerst ein Datenabruf aller Datensätze zu sehen, darunter eine Suchanfrage mit den gefundenen Ergebnissen. Screenshot: Fabian Rütschi (17.05.2025)

Metatext