Python Tutorial
- jetzt Python programmieren lernen

Methoden bei Klassen erstellen und aufrufen bei Python

In unserer Katzen-Klasse haben wir bisher nur Eigenschaften und nur die Methode __init__().

Bei der Festlegung, welche Methoden für unsere BauplanKatzenKlasse hatten wir notiert:

Eigenschaften:

  • Farbe
  • Alter
  • Rufname

Methoden:

  • miauen
  • schlafen
  • fressen
  • schmussen

Also integrieren wir als Methode „miauen“. Eigentlich müssten wir für die Lautsprache von Katzen 10 weitere unterschiedliche Lautarten als Methode integrieren (man sollte seiner Katze mal genauer zuhören – im Gegensatz zum Hund, der nur 10 kann, kann die Katze bis 100 Einzellaute). Aber wir wollen nicht übertreiben. Unsere digitale Katze darf nur „miauen“ als Methode.

Unser bisheriger Code:

class BauplanKatzenKlasse():
    """ Klasse für das Erstellen von Katzen """

    def __init__(self, rufname, farbe, alter):
        self.rufname = rufname
        self.farbe   = farbe
        self.alter   = alter

katze_sammy = BauplanKatzenKlasse("Sammy", "orange", 3)

Wir bauen einen weiteren Bereich (Einrückung nicht vergessen!) mit def tut_miauen() ein. Auch hier ist extrem wichtig, dass „self“ als erstes Argument nicht zu vergessen! Sonst erhält man die Fehlermeldung „TypeError: tut_miauen() takes 0 positional arguments but 1 was given“

class BauplanKatzenKlasse():
    """ Klasse für das Erstellen von Katzen """

    def __init__(self, rufname, farbe, alter):
        self.rufname = rufname
        self.farbe   = farbe
        self.alter   = alter

    def tut_miauen(self):
        print("miau")

katze_sammy = BauplanKatzenKlasse("Sammy", "orange", 3)

Um nun die Methode „tut_miauen()“ zu nutzen, wird nach dem Erzeugen des Objektes diese mit Objektnamen und Methode (verknüpft mit einem Punkt) und danach Klammern aufgerufen:

class BauplanKatzenKlasse():
    """ Klasse für das Erstellen von Katzen """

    def __init__(self, rufname, farbe, alter):
        self.rufname = rufname
        self.farbe   = farbe
        self.alter   = alter

    def tut_miauen(self):
        print("miau")

katze_sammy = BauplanKatzenKlasse("Sammy", "orange", 3)
katze_sammy.tut_miauen()

Auf dem Bildschirm erhalten wir als Ausgabe:

miau

Werte beim Methodenaufruf übergeben

Wir wollen nun die Anzahl des Miauens noch mitgeben können bzw. wenn wir keine Anzahl mitgeben, soll nur ein „Miau“ kommen. Wie bereits von den Eigenschaften können wir auch bei den Methoden Vorgabewerte mitgeben. In diesem Fall soll 1 die Vorgabe sein:

    def tut_miauen(self, anzahl = 1):
        print(anzahl * "miau ")

Rufen wir nun die Methode auf, können wir die Anzahl übergeben:

katze_sammy.tut_miauen(3)

Es erscheinen ordnungsgemäß die 3 „Miaus“:

miau miau miau

beliebig viele Methoden in einer Klasse anlegen

Wir sind in der Anzahl der Methoden nicht begrenzt. Im folgenden Beispiel integrieren wir noch schlafen und die Anzahl der Minuten des Schlafens:

Das ist dasselbe, wie wir schon bei der Methode „tut_miauen“ programmiert haben. Wir machen noch eine Textausgabe, wie lange geschlafen wird:

    def tut_schlafen(self, dauer):
        print(self.rufname, " schläft jetzt ", dauer , " Minuten ")

katze_sammy = BauplanKatzenKlasse("Sammy", "orange", 3)
katze_sammy.tut_schlafen(3)

Interessant wäre doch, wie lange die Katze insgesamt über den Tag weg schläft?

Dauer aufaddieren in Methode einer Klasse

Wir wollen mal die Schlafdauer aufsummieren. Dazu benötigen wir eine weitere Eigenschaft, die wir am Anfang mit 0 initialisieren. Wir nennen die Eigenschaft „schlafdauer“:

    def __init__(self, rufname, farbe, alter):
        self.rufname = rufname
        self.farbe   = farbe
        self.alter   = alter
        self.schlafdauer = 0

Jetzt müssen wir unsere Methode tut_schlafen() noch entsprechend erweitern. Auf den Wert der Eigenschaft „schlafdauer“ können wir einfach über das self.schlafdauer zugreifen und diesen Wert entsprechend erhöhen. Danach lassen wir uns die bisherige Gesamtdauer ausgeben

class BauplanKatzenKlasse():
    """ Klasse für das Erstellen von Katzen """

    def __init__(self, rufname, farbe, alter):
        self.rufname = rufname
        self.farbe   = farbe
        self.alter   = alter
        self.schlafdauer = 0

    def tut_miauen(self, anzahl = 1):
        print(anzahl * "miau ")

    def tut_schlafen(self, dauer):
        print(self.rufname, " schläft jetzt ", dauer , " Minuten ")
        self.schlafdauer += dauer
        print(self.rufname, " Schlafdauer insgesamt: ", self.schlafdauer, " Minuten ")

katze_sammy = BauplanKatzenKlasse("Sammy", "orange", 3)
katze_sammy.tut_miauen(3)
katze_sammy.tut_schlafen(3)
katze_sammy.tut_schlafen(6)

Wir erhalten nun als Ausgabe:

miau miau miau

Sammy schläft jetzt 3 Minuten

Sammy Schlafdauer insgesamt: 3 Minuten

Sammy schläft jetzt 6 Minuten

Sammy Schlafdauer insgesamt: 9 Minuten

Der coole Trick zum live Methoden und Klassen testen

Schöner wäre, wenn wir nicht bereits im Code unsere Aufrufe für die verschiedenen Methoden machen müssten, sondern live testen könnten. Das klappt, wenn wir unser Python-Programm in der Console mit einem Parameter aufrufen. Der Parameter verhindert, dass unser Programm sofort beendet wird und alle weiteren Eingaben werden ausgeführt, bis wir exit() eingeben.

Starten Sie in der Konsole das Programm mit dem Parameter „-i“ – die exakte Beschreibung von dem Trick gibt es im Kapitel www.python-lernen.de/trick-programm-ausfuehren-und-in-konsole-debuggen.htm

python -i BauplanKatzenKlasse.py

Im Folgenden sieht man die Möglichkeiten – erster Schritt: das bestehende Programm wird abgearbeitet und gibt folgende Ausgaben.

Axels-MacBook-Pro:Python-lernen.de$ python3 -i BauPlanKatze.py

miau miau miau

Sammy schläft jetzt 3 Minuten

Sammy Schlafdauer insgesamt: 3 Minuten

Sammy schläft jetzt 6 Minuten

Sammy Schlafdauer insgesamt: 9 Minuten

>>>

Jetzt können wir „katze_sammy“ miauen lassen – dazu geben wir einfach nach den 3 Größerzeichen den Funktionsaufruf ein:

Axels-MacBook-Pro:Python-lernen.de$ python3 -i BauPlanKatze.py

miau miau miau

Sammy schläft jetzt 3 Minuten

Sammy Schlafdauer insgesamt: 3 Minuten

Sammy schläft jetzt 6 Minuten

Sammy Schlafdauer insgesamt: 9 Minuten

>>> katze_sammy.tut_miauen(5)

miau miau miau miau miau

>>>

Und dann ein Powernap von 10 Minuten:

Axels-MacBook-Pro:Python-lernen.de$ python3 -i BauPlanKatze.py

miau miau miau

Sammy schläft jetzt 3 Minuten

Sammy Schlafdauer insgesamt: 3 Minuten

Sammy schläft jetzt 6 Minuten

Sammy Schlafdauer insgesamt: 9 Minuten

>>> katze_sammy.tut_miauen(5)

miau miau miau miau miau

>>> katze_sammy.tut_schlafen(10)

Sammy schläft jetzt 10 Minuten

Sammy Schlafdauer insgesamt: 19 Minuten

>>>

Wir können auch neue Objekte anlegen! Erwecken wir eine neue Katze zum Leben über:

katze_soni = BauplanKatzenKlasse("Soni", "getigert", 2)

Als Rückmeldung kommt nichts, da beim Anlegen einer neuen Instanz (Objektes) dies nicht von unserem Programm kommentiert wird:

Axels-MacBook-Pro:Python-lernen.de$ python3 -i BauPlanKatze.py

miau miau miau

Sammy schläft jetzt 3 Minuten

Sammy Schlafdauer insgesamt: 3 Minuten

Sammy schläft jetzt 6 Minuten

Sammy Schlafdauer insgesamt: 9 Minuten

>>> katze_sammy.tut_miauen(5)

miau miau miau miau miau

>>> katze_sammy.tut_schlafen(10)

Sammy schläft jetzt 10 Minuten

Sammy Schlafdauer insgesamt: 19 Minuten

>>> katze_soni = BauplanKatzenKlasse("Soni", "getigert", 2)

>>>

Auch „katze_soni“ darf schlafen – hier sieht man, dass die Schlafdauer für alle Katzen getrennt aufaddiert wird:

Axels-MacBook-Pro:Python-lernen.de$ python3 -i BauPlanKatze.py
miau miau miau 
Sammy  schläft jetzt  3  Minuten 
Sammy  Schlafdauer insgesamt:  3  Minuten 
Sammy  schläft jetzt  6  Minuten 
Sammy  Schlafdauer insgesamt:  9  Minuten 
>>> katze_sammy.tut_miauen(5)
miau miau miau miau miau 
>>> katze_sammy.tut_schlafen(10)
Sammy  schläft jetzt  10  Minuten 
Sammy  Schlafdauer insgesamt:  19  Minuten 
>>> katze_soni = BauplanKatzenKlasse("Soni", "getigert", 2)
>>> katze_soni.tut_schlafen(5)
Soni  schläft jetzt  5  Minuten 
Soni  Schlafdauer insgesamt:  5  Minuten 
>>>

Zum Beende der Testsession einfach quit() eingeben.

Unbedingt testen – diese Möglichkeit macht richtig Spaß und so kann man auch hartnäckige Fehler einfacher finden.

Zeit zum Üben! Methoden für unsere PKW-Klasse

Wir hatten als letzte Übung eine Klasse „pkw“ erstellt. Dieser fehlen noch Methoden. Unser Auto soll können:

  • hupen (ganz wichtige Methode!)
  • fahren (hier die Anzahl der KM eingeben und aufaddieren)
  • parken
  • Kilometerstand ausgeben

Viel Spaß beim Umsetzen. Unser bisheriger Programmcode als Beispiellösung, an dem weitergearbeitet werden kann:

class Pkw():
    """ Klasse für das Erstellen von Personenkraftwagen """

    def __init__(self, farbe, baujahr, kmstand, sitze, marke):
        self.farbe   = farbe
        self.baujahr = baujahr
        self.kmstand = kmstand
        self.sitze   = sitze
        self.marke   = marke

trabi = Pkw("rot", 1981, 143000, 4, "Trabi")