Zum Hauptinhalt springen

Objektorientierte Programmierung

Objektorientierte Programmierung (OOP) ist eine Methode zum Schreiben von Programmen, bei der wir Dinge aus der realen Welt (wie Tiere, Gegenstände oder Benutzer) als "Objekte" betrachten. Jedes Objekt hat Eigenschaften (Instanzvariablen) und Dinge, die es tun kann (Methoden). Jedes Objekt ist Instanz einer Klasse — eine Klasse ist eine Art "Bauplan" für Objekte.

OOP hilft uns, Programme auf eine organisierte Weise zu schreiben, sodass wir sie einfacher verstehen, verändern und wiederverwenden können.

Klassen und Objekte

class Hund:
def __init__(self, name, fellfarbe):
self.name = name
self.fellfarbe = fellfarbe

def mach_wuff(self):
print("Wuff!!")

def sag_wie_du_heisst(self):
print("Ich heisse " + self.name + ".")

def sag_deine_fellfarbe(self, sprache):
if sprache == "de":
print("Mein Fell ist " + self.fellfarbe + ".")
elif sprache == "en":
print("My fur is " + self.fellfarbe + ".")

benno = Hund("Benno", "schwarz")
manu = Hund("Manu", "braun")

benno.mach_wuff()
benno.sag_wie_du_heisst()
benno.sag_deine_fellfarbe("de")

manu.mach_wuff()
manu.sag_wie_du_heisst()
manu.sag_deine_fellfarbe("en")

Dieses Programm produziert folgende Ausgabe:

Wuff!!
Ich heisse Benno.
Mein Fell ist schwarz.
Wuff!!
Ich heisse Manu.
My fur is braun.

Der Aufbau dieser Klasse

  • Auf den Zeilen 1-16 wird eine Klasse namens Hund definiert.
  • Die Klasse Hund hat einen Konstruktor (Zeilen 2-3), der die Parameter self, name und fellfarbe entgegennimmt.
    • Der Konstruktor ist eine spezielle Funktion, die in jeder Klasse existiert, und immer genau den Namen __init__ hat. Er wird immer dann (automatisch) aufgerufen, wenn wir eine neue Instanz dieser Klasse erzeugen. Die Aufgabe des Konstruktors ist das Konstruieren dieser Instanz. Wir schreiben also alles in diese Funktion hinein, das wir beim Erzeugen einer neuen Instanz dieser Klasse erledigen müssen. Achtung: Wenn es bei einer Klasse mal nichts gibt, das wir im Konstruktor erledigen müssen, dann müssen wir ihn auch nicht hinschreiben.
    • Der spezielle Parameter self ermöglicht den Zugriff auf die jeweilige Instanz der Hund-Klasse.
    • Der Wert des Parameters name wird auf Zeile 3 der Instanzvariable self.name zugewiesen.
    • Der Wert des Parameters fellfarbe wird auf Zeile 4 der Instanzvariable self.fellfarbe zugewiesen.
  • Auf den Zeilen 6-7 wird die Methode mach_wuff() definiert.
    • Wenn eine Funktion zu einer Klasse gehört (also wie hier unter einem class eingerückt ist), dann nennen wir sie nicht Funktion, sondern Methode.
    • Jede Methode muss zwingend den speziellen Parameter self entgegennehmen — selbst dann, wenn er wie hier gar nicht benötigt wird.
  • Auf den Zeilen 9-10 wird die Methode sag_wie_du_heisst() definiert.
    • Auf Zeile 9 wird über den speziellen Parameter self auf die Instanzvariable self.name zugegriffen.
    • Die Ausgabe der Methode sag_wie_du_heisst() kann also für jede Instanz der Klasse Hund unterschiedlich sein. Er hängt davon ab, welchen Wert wir bei der Instanziierung dem Konstruktor für den Parameter name übergeben haben. Diesen Wert nennt man ein Konstruktor-Argument.
  • Auf den Zeilen 12-16 wird die Methode sag_deine_fellfarbe() definiert.
    • Nebst dem speziellen Parameter self nimmt diese Methode auf Zeile 12 einen zweiten Parameter sprache entgegen.
    • Die Ausgabe dieser Methode ist also abhängig vom Wert der Instanzvariable self.fellfarbe und vom Wert für den Parameter sprache.

Die Instanzen von Hund

  • Eine Klasse ist wie ein Bauplan.
  • Aus einer Klasse können wir beliebig viele Instanzen erzeugen.
  • Wenn wir eine Instanz einer Klasse erzeugen, dann instanziieren wir diese Klasse. Wir setzen also den Bauplan in die Tat um.
  • Eine Instanz einer beliebigen Klasse nennt man allgemein auch ein Objekt.
  • Auf Zeile 18 wird eine Instanz der Hund-Klasse mit den Konstruktor-Argumenten "Benno" und "schwarz" erzeugt.
    • Dabei wird als Erstes die Konstruktor-Funktion der Hund-Klasse ausgeführt.
      • Der Wert der Instanzvariable self.name hat in der Instanz benno den Wert "Benno".
      • Der Wert der Instanzvariable self.fellfarbe hat in der Instanz benno den Wert "schwarz".
    • Die resultierende Instanz wird der Variable benno zugewiesen.
    • Die Variable benno enthält nun also ein Objekt vom Datentyp Hund — sprich, eine Instanz der Hund-Klasse.
    • Konzeptuell repräsentiert das Objekt benno einen schwarzen Hund namens Benno.
  • Auf Zeile 19 wird eine Instanz der Hund-Klasse mit den Konstruktor-Argumenten "Manu" und "braun" erzeugt.
    • Dabei wird als Erstes die Konstruktor-Funktion der Hund-Klasse ausgeführt.
      • Der Wert der Instanzvariable self.name hat in der Instanz manu den Wert "Manu".
      • Der Wert der Instanzvariable self.fellfarbe hat in der Instanz manu den Wert "braun".
    • Die resultierende Instanz wird der Variable manu zugewiesen.
    • Die Variable manu enthält nun also ein Objekt vom Datentyp Hund — sprich, eine Instanz der Hund-Klasse.
    • Konzeptuell repräsentiert das Objekt manu einen braunen Hund namens Manu.
  • Auf den Zeilen 21-23 wird das Objekt benno verwendet.
    • Auf Zeile 21 wird die Methode mach_wuff() auf dem Objekt benno aufgerufen. Die Ausgabe ist Wuff!!.
    • Auf Zeile 22 wird die Methode sag_wie_du_heisst() auf dem Objekt benno aufgerufen. Die Ausgabe ist Ich heisse Benno..
    • Auf Zeile 23 wird die Methode sag_deine_fellfarbe() auf dem Objekt benno mit dem Argument "de" für den Parameter sprache aufgerufen. Die Ausgabe ist Mein Fell ist schwarz..
  • Auf den Zeilen 25-27 wird das Objekt benno verwendet.
    • Auf Zeile 25 wird die Methode mach_wuff() auf dem Objekt manu aufgerufen. Die Ausgabe ist Wuff!!.
    • Auf Zeile 26 wird die Methode sag_wie_du_heisst() auf dem Objekt manu aufgerufen. Die Ausgabe ist Ich heisse Manu..
    • Auf Zeile 27 wird die Methode sag_deine_fellfarbe() auf dem Objekt manu mit dem Argument "en" für den Parameter sprache aufgerufen. Die Ausgabe ist My fur is braun..