Übungen Thema 7
Aufgaben
Aufgaben zum Thema.
Aufgabe 7.1: Klasse Tier entwerfen
Führen Sie diese Anweisungen aus:
- Erstellen Sie eine Klasse mit den Namen
Tier
- Fügen Sie einen Konstuktor mit diesen Variablen hinzu:
- Den Namen als
name
- Die Hautfarbe als
_farbe
- Den Laut des Tieres als
laut
- Den Namen als
- Schreiben Sie eine Methode
ausgabe
und geben Sie diesen Satz aus:"Das {self._farbe}e Tier namens {self.name} macht: {self.laut}"
Aufgabe 7.2: Objekt Tier instanzieren
Rufen Sie ein Tier mit den folgenden Angaben ins Leben:
- Name: Pixel
- Farbe: grau
- Laut: Joink!
Führen Sie die Objekt-Methode ausgabe
aus.
Aufgabe 7.3: Getter und Setter hinzufügen
Erstellen Sie eine Getter- und Setter-Methode für die Eigenschaft _farbe
. Passen Sie die Farbe des Tieres aus der vorhergehenden Aufgabe an und führen Sie erneut die Methode ausgabe
aus.
⭐ Getter und Setter hinzufügen
Aufgabe 7.4: Klasse Tier vererben
Vereben Sie Klasse Tier
zu einer neuen Klasse Hund
. Die neue Klasse nimmt als zusätzlichen Parameter die Variable alter
entgegen. Erstellen Sie ein neues Objekt aus der Klasse Hund mit diesen Angaben:
- Name: Dogster
- Farbe: blau
- Laut: Yikes!
- Alter: 37
Führen Sie die Objekt-Methode ausgabe
aus.
Aufgabe 7.5: Klasse Getränkeautomat entwerfen
Sie wurden beauftragt eine Software zur Steuerung eines Getränkeautomats zu schreiben. Sie haben sich für die Programmiersprache Python und den objektorientierten Ansatz entschieden. Sie möchten den Getränkeautomat als Klasse abbilden und haben sich folgende Notizen gemacht:
Der Getränkeautomat hat diese Instanzvariablen:
Ein Dictionary mit den verfügbaren Produkten:
produkte = { 1: "Apfelsaft", 2: "Wasser", 3: "Redbull"}
Ein Dictionary mit dem Bestand:
bestand = { "Apfelsaft": 3, "Wasser": 4, "Redbull": 0}
Ein String mit dem Automatennamen:
name = "Gratis"
Im Weiteren hat der Automat diese Methoden:
Die Methode Auflisten
listet die Produkte auf
for key,value in self.produkte.items():
print(f"Auswal {key}: {value}")
Die Methode Ausgeben
erwartet eine Nummer, prüft den Bestand und simuliert eine Ausgabe des Produkts
produkt = self.produkte[nummer]
bestand = self.bestand[produkt]
if(bestand > 0):
print(f"Das Produkt {self.produkte[nummer]} wurde ausgeben.")
self.bestand[produkt] = (bestand - 1)
print(f"Es sind noch {self.bestand[produkt]} Stk. verfügbar.")
else:
print("Das gewählte Produkt ist nicht verfügbar.")
Fügen Sie die Eigenschaften und Methoden zu einer fertigen Python-Klasse zusammen.
class Getränkeautomat:
def __init__(self, produkte, ...):
self.produkte = produkte
...
def Auflisten(self):
...
...
⭐ Klasse Getränkeautomat entwerfen
Aufgabe 7.6: Getränkeautomat ausführen
Sie haben die Python-Klasse für den Getränkeautomat entworfen und können nun die Software ausführen. Instanzieren Sie die Getränkeautomat-Klasse mit den benötigen Parameter. Rufen Sie die beiden Methoden auf und testen Sie den Automaten.
Dazu folgende Inputs:
produkte = { 1: "Apfelsaft", 2: "Wasser", 3: "Redbull", 4: "Snickers"}
bestand = { "Apfelsaft": 3, "Wasser": 4, "Redbull": 0, "Snickers": 5}
automat = Getränkeautomat(produkte, bestand, "Gratis")
automat.Auflisten()
automat.Ausgeben(2)
automat.Ausgeben(3)
Aufgabe 7.7: Klasse Getränkeautomat erweitern
Wir möchten den Namen des Getränkeautomats auch nach der Instanzierung ändern können. Erstellen Sie eine Getter- und Setter-Methode für die Instanzvariable name
.
@property
def name(self):
return self._name
@name.setter
def name(self, name):
self._name = name
Bennen Sie die Instanzvariable von name
zu _name
.
⭐ Klasse Getränkeautomat erweitern
Aufgabe 7.8: Getränkeautomat prüfen
Erweitern Sie die Ausgabe der Methode Auflisten
mit folgendem Code:
print(f"Der Geränkeautomat {self._name} hat dieses Angebot:")
Instanzieren Sie die Klasse und rufen Sie die neue Setter-Methode auf.
produkte = { 1: "Apfelsaft", 2: "Wasser", 3: "Redbull", 4: "Snickers"}
bestand = { "Apfelsaft": 3, "Wasser": 4, "Redbull": 0, "Snickers": 5}
automat = Getränkeautomat(produkte, bestand, "Gratis")
automat.Auflisten()
automat.name = "Redbull-o-mat"
automat.Auflisten()
Als zusätzliche Aufgaben können Sie Getter- und Setter-Methoden für die Instanzvariablen produkte
und bestand
hinzufügen.
Wiederholungsfragen
W1: W1: Erklären Sie den Unterschied zwischen Klasse und Objekt.
Objekte werden von der Klasse abgeleitet. Wenn Sie also eine Auto-Klasse programmiert haben, können Sie im laufenden Programm daraus unzählige Auto-Objekte erzeugen. Anstelle von Objekten sind auch die Begriffe Instanz oder Exemplar üblich.
Python ist insofern ein Sonderfall, als auch die Klasse an sich als Objekt gilt.
W2: Wozu dient der Konstruktor? Wie lautet sein interner Name, wie wird er aufgerufen?
Innerhalb der Klasse wird der Konstruktor als spezielle Methode mit dem Namen init implementiert. Der erste Parameter lautet immer self und gibt Zugriff auf die neue Objektinstanz.
Zum Aufruf des Konstruktors kommt es, wenn Sie ein Objekt erzeugen, also var = MyClass(parameter) aufrufen.
W3: Die folgende Klasse sei gegeben:
class MyClass():
def __init__(self, a, b):
self.a = a
self.b = b
Welche Ausgaben liefern die beiden folgenden print-Funktionen?
obj = MyClass(3, 4)
print(MyClass.a)
print(obj.a)
Ist der folgende Code zulässig?
obj.c = 7
print(obj.c)
# Beispieldatei instancevar.py obj = MyClass(3, 4) print(MyClass.a) # Fehler, MyClass hat kein Attribut 'a' print(obj.a) # Ausgabe 3Im Gegensatz zu den meisten anderen Programmiersprachen sind Objekte zur Laufzeit um zusätzliche Attribute (also Variablen und Methoden) erweiterbar. Daher funktioniert dieser Code ohne Probleme:
obj.c = 7 print(obj.c) # Ausgabe 7
W4: Entwerfen Sie den Code für eine Bankkontoklasse, die sich wie folgt nutzen lässt:
k1 = Konto('Michael', 200, 0)
k2 = Konto('Maria')
k3 = Konto('Peter', 1000, 500)
k1.einzahlen(100)
if k2.abheben(100):
print('Geld von Konto 2 abgehoben')
if k3.abheben(1200):
print('Geld von Konto 3 abgehoben')
for k in [k1, k2, k3]:
print(k)
# Beispieldatei konto.py class Konto(): # Konstruktor def __init__(self, name, startguthaben=0, rahmen=0): # private Instanzvariablen self.__name = name self.__guthaben = startguthaben self.__rahmen = rahmen# Instanzmethoden def einzahlen(self, betrag): if betrag<=0: raise ValueError('Ungültige Parameter!') self.__guthaben += betrag
def abheben(self, betrag): if betrag<=0: raise ValueError('Ungültige Parameter!') if betrag > self.__guthaben + self.__rahmen: print('Zu wenig Geld auf dem Konto.') return False else: self.__guthaben -= betrag return True
# Objekt ausgeben def str(self): s = 'Konto von %s:\n Guthaben: %d\n' +
' Überziehungsrahmen: %d\n' return s % (self.__name, self.__guthaben, self.__rahmen)