Zum Inhalt

04 - Objekteorientierte Programmierung

Python ist eine objektorientierte Programmiersprache. Das bedeutet, dass alle Daten in Objekten gespeichert werden. Objekte sind eine Kombination aus Daten und Funktionen, die auf diese Daten angewendet werden können. Die Daten werden in Variablen gespeichert, die Funktionen werden Methoden genannt.

Objekte

Bisher haben wir unbewusst schon mit Objekten gearbeitet und kennen daher auch schon einige. Zum Beispiel kennen wir die Datentypen int, float, str und bool. Diese Datentypen sind Objekte, die Daten und Methoden enthalten.

Methoden

Methoden sind Funktionen, die auf Objekte angewendet werden können. Sie werden mit einem Punkt an das Objekt angehängt. Die Syntax ist objekt.methode(). Die Klammern sind dabei wichtig, da sie angeben, dass es sich um eine Funktion handelt. Als Beispiel schauen wir uns nun einige Methoden an.

Methoden von str

Wir kennen bereits die Methode str.isdigit(). Diese Methode prüft, ob ein String nur aus Ziffern besteht.

str.lower() wandelt alle Buchstaben in einem String in Kleinbuchstaben um.

str.upper() wandelt alle Buchstaben in einem String in Großbuchstaben um.

str.replace(alt, neu) ersetzt alle Vorkommen von alt durch neu.

str.split(sep) teilt einen String an den Stellen, an denen sep vorkommt. Das Ergebnis ist eine Liste.

Methoden von list

list.append(element) fügt ein Element am Ende einer Liste hinzu.

list.insert(index, element) fügt ein Element an der Stelle index in eine Liste ein.

list.remove(element) entfernt das erste Vorkommen von element aus einer Liste.

list.pop(index) entfernt das Element an der Stelle index aus einer Liste und gibt es zurück.

list.sort() sortiert eine Liste.

list.reverse() dreht die Reihenfolge der Elemente in einer Liste um.

list.index(element) gibt den Index des ersten Vorkommens von element in einer Liste zurück.

list.count(element) gibt die Anzahl der Vorkommen von element in einer Liste zurück.

list.clear() löscht alle Elemente aus einer Liste.

Klassen

Klassen sind die "Baupläne" für Objekte. Sie enthalten die Daten und Methoden, die ein Objekt haben soll. Um ein Objekt zu erstellen, wird eine Klasse instanziiert. Das bedeutet, dass ein Objekt der Klasse erstellt wird.

Klassen erstellen

Eine Klasse wird mit dem Schlüsselwort class erstellt. Nach dem Schlüsselwort folgt der Name der Klasse. Der Name wird mit einem Großbuchstaben geschrieben. Anschließend folgt ein Doppelpunkt und die Definition der Klasse.

klassen1.py
class Auto:
    pass   # Ein Behfehl, der nichts macht

Wir haben uns jetzt eine Klasse erstellt, die noch keine Daten und Methoden enthält.

Objekte erstellen

Um ein Objekt zu erstellen, schreiben wir den Namen der Klasse gefolgt von runden Klammern. Anschließend speichern wir das Objekt in einer Variable.

klassen1.py
1
2
3
4
5
6
class Auto:
    pass   # Ein Behfehl, der nichts macht

auto = Auto()

print(auto)
python klassen1.py<__main__.Auto object at 0x7f8b1c2b5d30>

Wir haben nun ein Objekt der Klasse Auto erstellt. Das Objekt wird in der Variable auto gespeichert. Wenn wir das Objekt ausgeben, sehen wir, dass es sich um ein Objekt der Klasse Auto handelt.

Daten hinzufügen

Wir wollen nun Daten zu unserer Klasse hinzufügen. Dazu erstellen wir eine Methode __init__. Diese Methode wird aufgerufen, wenn ein Objekt der Klasse erstellt wird. Die Methode erwartet mindestens einen Parameter, der self heißt. Dieser Parameter ist eine Referenz auf das Objekt, das erstellt wird. Wir können nun Daten zu dem Objekt hinzufügen, indem wir sie mit einem Punkt an self hängen.

klassen1.py
class Auto:
    def __init__(self):
        self.farbe = "rot"
        self.marke = "VW"
        self.modell = "Golf"
        self.kilometerstand = 0
        self.tank = 0
        self.tankgroesse = 50
        self.verbrauch = 5
        self.geschwindigkeit = 0

auto = Auto()

print(auto.farbe)

auto.farbe = "blau"

print(auto.farbe)
python klassen1.pyrot
blau

Wir haben nun Daten zu unserer Klasse hinzugefügt. Diese Daten werden Attribute genannt. Wir können die Attribute mit einem Punkt an das Objekt hängen. Wir können die Attribute auch verändern, indem wir sie mit einem Punkt an das Objekt hängen und ihnen einen neuen Wert zuweisen.

Methoden hinzufügen

Wir wollen nun Methoden zu unserer Klasse hinzufügen. Dazu erstellen wir eine Funktion innerhalb der Klasse. Die Funktion erwartet mindestens einen Parameter, der self heißt. Dieser Parameter ist eine Referenz auf das Objekt, auf dem die Methode aufgerufen wird.

klassen1.py
class Auto:
    def __init__(self):
        self.farbe = "rot"
        self.marke = "VW"
        self.modell = "Golf"
        self.kilometerstand = 0
        self.tank = 0
        self.tankgroesse = 50
        self.verbrauch = 5
        self.geschwindigkeit = 0

    def tanken(self, liter):
        self.tank = self.tank + liter
        if self.tank > self.tankgroesse:
            print("Du hast", self.tank - self.tankgroesse, "Liter verschüttet.")
            self.tank = self.tankgroesse

auto = Auto()

print(auto.tank)

auto.tanken(10)

print(auto.tank)
python klassen1.py0
10

Wir haben nun eine Methode zu unserer Klasse hinzugefügt. Diese Methode fügt dem Attribut tank einen Wert hinzu. Wir können die Methode mit einem Punkt an das Objekt hängen. Die Methode erwartet einen Parameter, der liter heißt. Dieser Parameter ist der Wert, der dem Attribut tank hinzugefügt wird.

Ein Auto kann natürlich nicht nur betankt werden, sondern auch beschleunigen und bremsen. In unserem Modell können wir bisher noch keine Zeit messen, daher verbraucht unsere Auto nur beim Beschleunigen Benzin. Wir wollen nun eine Methode beschleunigen hinzufügen, die die Geschwindigkeit des Autos erhöht und Benzin verbraucht. Wir wollen auch eine Methode bremsen hinzufügen, die die Geschwindigkeit des Autos verringert.

klassen1.py
class Auto:
    def __init__(self):
        self.farbe = "rot"
        self.marke = "VW"
        self.modell = "Golf"
        self.kilometerstand = 0
        self.tank = 0
        self.tankgroesse = 50
        self.verbrauch = 5
        self.geschwindigkeit = 0

    def tanken(self, liter):
        self.tank = self.tank + liter
        if self.tank > self.tankgroesse:
            print("Du hast", self.tank - self.tankgroesse, "Liter verschüttet.")
            self.tank = self.tankgroesse

    def beschleunigen(self, geschwindigkeit):
        self.geschwindigkeit = self.geschwindigkeit + geschwindigkeit
        self.tank = self.tank - geschwindigkeit * self.verbrauch / 100

    def bremsen(self, geschwindigkeit):
        self.geschwindigkeit = self.geschwindigkeit - geschwindigkeit

auto = Auto()

print("Geschwindigkeit:",auto.geschwindigkeit)

auto.beschleunigen(10)

print("Geschwindigkeit:",auto.geschwindigkeit)
print("Tank:",auto.tank)

auto.bremsen(5)

print("Geschwindigkeit:",auto.geschwindigkeit)
python klassen1.pyGeschwindigkeit: 0
Geschwindigkeit: 10
Tank: -0.5
Geschwindigkeit: 5

Wir haben nun zwei Methoden hinzugefügt, die die Geschwindigkeit des Autos verändern. Die Methode beschleunigen erhöht die Geschwindigkeit und verbraucht Benzin. Die Methode bremsen verringert die Geschwindigkeit. Wir können die Methoden mit einem Punkt an das Objekt hängen. Die Methoden erwarten einen Parameter, der geschwindigkeit heißt. Dieser Parameter ist der Wert, um den die Geschwindigkeit erhöht oder verringert wird. Allerdings können wir auch mit leerem Tank beschleunigen. Das wollen wir verhindern, indem wir die Methode beschleunigen ändern.

... TODO ...