Ü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
  • Schreiben Sie eine Methode ausgabe und geben Sie diesen Satz aus: "Das {self._farbe}e Tier namens {self.name} macht: {self.laut}"

Klasse Tier entwerfenopen in new window

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.

Objekt Tier instanzierenopen in new window

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ügenopen in new window

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.

Klasse Tier vererbenopen in new window

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 entwerfenopen in new window

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)

Getränkeautomat ausführenopen in new window

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 erweiternopen in new window

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.

Getränkeautomat prüfenopen in new window

Wiederholungsfragen

W1: W1: Erklären Sie den Unterschied zwischen Klasse und Objekt.

Grundsätzlich gibt der Code einer Klasse vor, welche Funktionen die Klasse erfüllt, das heißt, welche Variablen und Methoden es gibt. Wenn Sie so wollen, ist die Klasse ein Bauplan.

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?

Die Aufgabe des Konstruktors besteht darin, die Daten (Instanzvariablen) eines neuen Objekts zu initialisieren. Oft werden im Konstruktor auch die übergebenen Parameter daraufhin überprüft, ob es sich um sinnvolle Daten handelt. Ist das nicht der Fall, kann ein Fehler ausgelöst werden.

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)
MyClass.a ist nicht zulässig. a ist eine Instanzvariable, der Zugriff kann nur über ein Objekt erfolgen.
# Beispieldatei instancevar.py
obj = MyClass(3, 4)
print(MyClass.a)  # Fehler, MyClass hat kein Attribut 'a'
print(obj.a)      # Ausgabe 3
Im 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)
Die Klasse für ein Bankkonto kann z. B. so aussehen:
# 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)