313
10.12
Lösungen
10.12 Lösungen
Lösung 1
Erläuterung:
#1: Schwach privates Klassenattribut mit Dictionary, das einem Elementsymbol ein Tupel
aus Name des Stoffes und Dichte (in g/ccm) zuordnet.
# ding.py
class Ding(object):
""" Modell eines Gegenstandes aus einem Metall
Öffentliche Methoden:
getVolumen, getMasse, __str__()
" " "
dichte = {'Au':('Gold',19.32),
'Fe':('Eisen',7.87),
'Ag':('Silber',10.5)} #1
def __init__(self, symbol, volumen):
self.__volumen = float(volumen)
self._symbol = symbol
d e f get M a sse ( sel f ) : #2
return self.__volumen*self._dichte[self._symbol][1]
def getVolumen(self):
return self.__volumen
d e f __s t r __( s elf ) : #3
beschreibung = 'Ein Ding aus '+ \
self._dichte[self._symbol][0] + \
' mit einer Masse von ' + \
format(self.getMasse(), '.2f') + ' g'
return beschreibung
# Hauptprogramm mit Anweisungen zum Testen der Klasse Ding
krone = Ding('Au', 200)
print('Masse: ', krone.getMasse())
print('Volumen: ', krone.getVolumen())
print(krone)
Kapitel 10
Definition eigener Klassen
314
#2: Aus den Attributen __volumen und __dichte wird die Masse berechnet und zurück-
gegeben. Dabei ist
self._dichte[self.__symbol][1] das zweite Element des Tupels, das
im Dictionary
self._dichte dem Elementsymbol self._symbol zugeordnet ist.
#3: Überladung der Funktion str(). Die Methode liefert eine lesbare String-Repräsentation
der Instanz
self.
Programmlauf:
Lösung 2
Skript:
Masse: 3864.0
Volumen: 200.0
Ein Ding aus Gold mit einer Masse von 3864.00 g
# quader.py
from ding import Ding
class Quader(Ding):
def __init__(self, symbol,
lae n ge, b r eit e , ho e h e): #1
Ding.__init__(self, symbol, laenge*breite*hoehe)
self.__laenge = float(laenge)
self.__breite = float(breite)
self.__hoehe = float(hoehe)
def __gt__(self, other): #2
return self.getMasse() > other.getMasse()
def __ge__(self, other):
return self.getMasse() >= other.getMasse()
def __eq__(self, other):
return self.getMasse() == other.getMasse()
def __str__(self):
text = 'Ein Quader aus '+ \
self._dichte[self._symbol][0]+ ', ' + \
format(self.__laenge, '.2f') + ' cm mal '+ \
format(self.__breite, '.2f') + ' cm mal'+ \
format(self.__hoehe ,'.2f') + ' cm'
return text
315
10.12
Lösungen
Erläuterung:
#1: Zunächst wird die Initialisierungsprozedur der Basisklasse aufgerufen. Als Wert für das
Attribut
__volumen wird das Produkt aus Länge, Breite und Höhe des Quaders übergeben.
#2: Überladen der Vergleichsoperatoren >, >= und ==. Die Methode getMasse() wurde von
der Basisklasse geerbt.
Programmlauf:
Lösung 3
Hinweis: Wegen der try...except-Anweisung funktioniert ein Aufruf von range() auch
dann, wenn für die Items der Liste die Subtraktion gar nicht definiert ist.
# Hauptprogramm mit Anweisungen zum Testen der Klasse Quader
silberbarren = Quader('Ag', 2, 3, 4)
print('Masse: ',silberbarren.getMasse())
print('Volumen: ',silberbarren.getVolumen())
print(silberbarren)
input('Beenden mit <ENTER>')
Masse: 252.0
Volumen: 24.0
Ein Quader aus Silber, 2.00 cm mal 3.00 cm mal 4.00 cm
# newlist.py
class NewList(list):
def __init__(self, s=[]):
s = list(s)
list.__init__(self, s)
def range(self):
t r y:
return max(self) - min(self)
except: return 0
>>> s = Newlist(["zwo", "drei", "vier"])
>>> s.range()
0
Kapitel 10
Definition eigener Klassen
316
Lösung 4
Skript:
# laenge.py
class Laenge (object):
""" Modell einer Strecke """
__meter = {'mm': 0.001, 'cm':0.01, 'm':1, 'km':1000,
'in':0.0254, 'ft':0.3048,
'yd':0.9143, 'mil':1609} #1
def __init__(self, betrag, einheit):
self.__betrag = float(betrag) #2
self.__einheit=einheit
def getMeter(self):
return self.__betrag*self.__meter[self.__einheit]
def __add__(self, other): #3
s = self.getMeter() + other.getMeter()
return Laenge(s/self.__meter[self.__einheit],
se l f._ _ e inh e i t)
0ef __gt__(self, other): #4
return self.getMeter() > other.getMeter()
def __ge__(self, other): #5
return self.getMeter() >= other.getMeter()
def __eq__(self, other): #6
return self.getMeter() == other.getMeter()
def __str__(self):
return str(self.__betrag)+' ' + self.__einheit
# Hauptprogramm zum Testen
print(Laenge(12, 'cm') + Laenge (2, 'in'))
erddurchmesser = Laenge (12713.507, 'km')
print(erddurchmesser)
print(Laenge(0, 'mil') + erddurchmesser) #7
317
10.12
Lösungen
Erläuterung:
#1: Klassenattribut mit Dictionary zum Umrechnen von Längeneinheiten.
#2: Durch explizite Typkonvertierung mit float() wird sichergestellt, dass das Attribut
__betrag einen Wert vom Typ float besitzt.
#3: Überladen des Plusoperators +. Zurückgegeben wird ein neues Objekt der Klasse Laenge.
Es beschreibt die Summe der beiden Längen-Objekte
self und other und hat die Längen-
einheit von
self übernommen.
#4: Überladen des Operators > (»größer als«). Zurückgegeben wird True, falls die Länge des
aktuellen Objektes (in Meter) größer ist als die Länge des zweiten Objektes. Sonst wird
False zurückgegeben.
#5: Überladen des Operators >= (»größer oder gleich«).
#6: Überladen des Operators == (»gleich«).
#7: In dieser Anweisung wird erzwungen, dass der Erddurchmesser in Meilen ausgegeben
wird.
Programmlauf:
17.08 cm
12713.507 km
7901.49596022 mil

Get Python 3 - Lernen und professionell anwenden now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.