Übung — Objekte und Klassen
Entwurf zur Erprobung von OOPython. Grundlage ist die Seite Übungen des Kapitels Objekte und Klassen. Jede Aufgabe bekommt eine eigene Instanz des Werkzeugs, zugeschnitten auf das, was die Aufgabe verlangt: Objekte benutzen und beobachten, eine Klasse vervollständigen, eine Klasse von Grund auf entwerfen oder das Verhalten eines Konstruktors erklären.
Aufgabe 1: Objekte erzeugen und benutzen
Gegeben ist eine Implementierung der Klasse Wuerfel:
from random import randint
class Wuerfel(object):
def __init__(self):
self.augen = randint(1, 6)
def werfen(self):
self.augen = randint(1, 6)
Im Werkzeug ist die Klasse bereits geladen. Der Quelltext liegt zum Lesen daneben, verändern lässt er sich hier nicht.
data-config dieses Werkzeugs
{
"titel": "Aufgabe 1 — Würfel",
"profil": "zustand-verstehen",
"quelltextAnzeigen": true,
"dateien": "wuerfel.py"
}
(a) Erzeuge ein Objekt der Klasse Wuerfel und öffne dazu den . Würfele
über das Menü der Objektkarte so lange, bis der Würfel eine 6 liefert. Wie viele Würfe hast du
gebraucht? Der hilft beim Zählen.
(b) Erzeuge einen zweiten Würfel. Würfele mit beiden, bis beide dieselbe Augenzahl zeigen (ein Pasch). Woran erkennst du im , dass es zwei verschiedene Objekte sind?
(c) Schreibe die Zeilen des Code-Spiegels für (a) als Python-Dialog auf. Welche Zeile kommt mehrfach vor?
Aufgabe 2: Eine Klasse implementieren
In Python gibt es keinen vordefinierten Datentyp für Brüche.
Mit der Klasse Bruch soll diese Lücke geschlossen werden.
Wir beginnen mit dem folgenden Klassendiagramm zur Klasse Bruch:
Im Werkzeug ist die Klasse nur angefangen: Der Konstruktor hat schon die richtigen Parameter, legt aber noch keine Attribute an, und die beiden Methoden fehlen ganz. Das Klassendiagramm im Werkzeug folgt deinem Quelltext beim Tippen — wenn es dem Diagramm oben entspricht, ist die Struktur vollständig.
data-config dieses Werkzeugs
{
"titel": "Aufgabe 2 — Bruch",
"hauptprogramm": "main_bruch.py",
"profil": "selbst-programmieren",
"dateien": "bruch.py"
}(a) Vervollständige die Klasse im Editor, so dass Python-Dialoge der folgenden Art möglich werden. Führe den Quelltext aus, prüfe dann mit einem Objekt auf der und dem — oder starte das vorbereitete , das genau diesen Dialog enthält, und lies die Ausgabe:
>>> b = Bruch(4, 6)
>>> b.erweitern(3)
>>> b.kuerzen(2)
>>> b.zaehler
...
>>> b.nenner
...
(b) (eher schwierig) Ergänze die Klasse Bruch um eine Operation vollstaendigKuerzen.
Entwickle auch dazu eine geeignete Implementierung. Teste sie mit Bruch(12, 18).
Hinweis: Mit Brüchen möchte man natürlich auch rechnen. Das werden wir aber erst in einem der folgenden Abschnitte betrachten.
Aufgabe 3: Eine Klasse konzipieren und implementieren
Ein Zähler ist ein Gerät (Objekt), mit dem man hochzählen kann, und den man gezielt wieder auf Null setzen kann. Man benutzt solche Geräte z.B. bei Verkehrszählungen.
(a) Modelliere eine Klasse Zaehler, mit der man Objekte erzeugen kann, die sich
wie Zähler in der Wirklichkeit verhalten. Berücksichtige vorerst noch nicht, dass es für die
Zahl eine Obergrenze gibt. Stell die modellierte Klasse zuerst per Hand mit einem Klassendiagramm dar.
Implementiere die Klasse dann im Werkzeug — der Editor ist leer — und vergleiche das Klassendiagramm,
das das Werkzeug zeichnet, mit deinem. Teste anschließend mit Objekten auf der .
data-config dieses Werkzeugs
{
"titel": "Aufgabe 3 — Zähler",
"hauptprogramm": "main_zaehler.py",
"profil": "selbst-programmieren",
"laden": "klick",
"dateien": "zaehler.py"
}(b) Wenn man eine Uhr simulieren möchte, dann benötigt man einen Sekunden- bzw. Minutenzähler, der so zählt:
0, 1, 2, 3, ..., 58, 59, 0, 1, 2, 3, ..., 58, 59, 0, 1, 2, ...
Ein Stundenzähler zählt entsprechend:
0, 1, 2, 3, ..., 23, 0, 1, 2, 3, ..., 23, 0, 1, 2, ...
Modelliere und implementiere auch für Zählsituationen mit einer Obergrenze eine geeignete
Klasse. Schreibe sie in dieselbe Datei unter die Klasse Zaehler; beide Klassen
erscheinen dann im Diagramm. Das vorbereitete zählt 65-mal hoch — passe es
an deine Klasse an und prüfe an der , ob der Zähler nach 59 wirklich bei 0 weitermacht.
65-mal zu klicken wäre auch möglich, aber genau dafür gibt es Programme.
Aufgabe 4: Eine Klasse konzipieren
Grafikprogramme können geometrische Objekte (u.a. Kreise) verwalten. Überlege, welche Daten von einem
Objekt der Klasse Kreis verwaltet werden müssen und welche Operationen ein Objekt der Klasse
Kreis zur Verfügung stellen könnte.
Beschreibe die Klasse Kreis zuerst mit einem Klassendiagramm per Hand. Entwickle dann
eine geeignete Implementierung im Werkzeug. Das Diagramm, das das Werkzeug aus deinem Quelltext
zeichnet, ist die Kontrolle: Es soll deinem Entwurf entsprechen.
data-config dieses Werkzeugs
{
"titel": "Aufgabe 4 — Kreis",
"profil": "selbst-programmieren",
"laden": "klick",
"dateien": "kreis.py"
}Aufgabe 5: Konstruktoren mit flexibler Anzahl von Parametern
Die folgende Deklaration des Konstruktors erlaubt es, Objekte flexibel mit Anfangswerten zu versehen:
class Konto(object):
def __init__(self, nummer=0, betrag=0):
self.nr = nummer
self.stand = betrag
self.inhaber = None
def einzahlen(self, betrag):
self.stand = self.stand + betrag
def auszahlen(self, betrag):
self.stand = self.stand - betrag
Der nachfolgende Python-Dialog zeigt einige Möglichkeiten, Objekte zu erzeugen:
>>> k1 = Konto()
>>> k1.nr
0
>>> k1.stand
0
>>> k2 = Konto(1)
>>> k2.nr
1
>>> k2.stand
0
>>> k3 = Konto(2, 1000.0)
>>> k3.nr
2
>>> k3.stand
1000.0
>>> k4 = Konto(betrag=400.0)
>>> k4.nr
0
>>> k4.stand
400.0
data-config dieses Werkzeugs
{
"titel": "Aufgabe 5 — Konstruktor mit Vorgabewerten",
"profil": "zustand-verstehen",
"quelltextAnzeigen": true,
"laden": "klick",
"dateien": "konto2.py"
}
(a) Erzeuge die vier Objekte k1 bis k4 über das Menü des Klassenkastens.
Der Dialog zeigt für jeden Parameter seinen Vorgabewert; lass ein Feld leer, wenn im Dialog oben
kein Wert übergeben wird. Vergleiche nach jedem Objekt die Zeile im Code-Spiegel mit der Zeile
im Python-Dialog.
(b) Öffne zu jedem Objekt den Inspektor und erkläre, wie die jeweiligen Attributwerte zustande kommen.
(c) Bei k4 wurde nur betrag angegeben. Warum reicht dafür nicht
Konto(400.0)? Probiere es aus und prüfe im Inspektor.
Quellen
- [1]: Zähler - Urheber: Wesha - Lizenz: Creative Commons BY-SA 3.0
