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
- schmusen
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 Konsole 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")