Informatik Sek II
Objektorientiertes Programmieren

Python
LFB.-Kurs
W. Arnhold
[ Übersicht | vorige Seite | nächste Seite | Ganz unten ]
Python Python - Syntax :  Klassen  III

Klassen  III

Hier kommt eigentlich nichts wahnsinnig neues, eher ein weiteres Beispiel zum Festigen der zarten Erkenntnis.

Eine Klasse umschließt Daten und Zugriffe. Damit man nicht direkt an die Innereien herangeht. Man soll nur die vom Hersteller vorgesehenen Methoden verwenden, mit der Klasse umzugehen.

Ein schönes Beispiel für diese Philosophie ist ein Geldautomat. Auch hier soll der Benutzer ja nur die dafür vorgesehenen Knöpfe benutzen. Der Direktzugriff auf das Innere des Automaten ist eher unerwünscht.
Nehmen wir an, der Automat hat nur zwei Sorten Scheine: Fünfziger und Hunderter. Er zahlt nach einem festen Schema aus. Wenn das nicht geht, gibt es kein Geld, sondern eine Fehlermeldung auf dem Schirm.
Diese Prozedur hat zwei Parameter (eigentlich drei, aber der erste wird beim Aufruf nicht benutzt). Hinter den Parametern "fuffis" und "hunnis" steht ein sogenannter Default-Wert. Wenn beim Aufruf der Prozedur weniger Parameter mitgegeben werden als im Prozedurkopf vorhanden sind, werden -- von vorne beginnend -- die mitgegebenen Parameter an die Prozedur verteilt, für die fehlenden werden die Defaultwerte angenommen. Wenn es diese im Fall fehlender Aufrufparameter nicht gibt, ist dies ein Fehler. Deshalb müssen diese Parameter auch am Ende der Liste stehen. Man kann diese Prozedur also mit keinem, einem oder zwei Parametern aufrufen. Wir testen das nachher mal aus.


class Bankomat:
  def __init__(self, fuffis = 0, hunnis = 0):
    if fuffis == 0:
        self.fuenfziger = 20
    else:
        self.fuenfziger = fuffis

    if hunnis == 0:
        self.hunderter = 30
    else:
        self.hunderter = hunnis

    self.auszahlen = {
        50   : (1, 0),        # ein Fünfziger, kein Hunderter
        100  : (2, 0),        # zwei Fünfziger, kein Hunderter usw.
        150  : (1, 1),
        200  : (2, 1),
        300  : (2, 2),
        400  : (2, 3),
        500  : (2, 4),
        600  : (2, 5),
        800  : (4, 6),
        1000 : (4, 8)
    }

 
Hier wurde die Anzahl der eingefüllten Scheine vermerkt. Wurden keine Parameter übergeben, wird eine Standardzahl eingetragen.
Jetzt wird in einem Dictionary die Auszahlungsweise eingetragen: für jeden Betrag die Anzahl der Fünfziger- und Hunderterscheine: Damit ist der Automat geladen und weiss, wie er arbeiten soll. Nun eine kleine Prozedur, die angibt, wieviele Scheine von welcher Sorte gezahlt werden sollen:

  def scheine(self, betrag):
    return self.auszahlen[betrag]

Die folgende Prozedur nimmt (quasi) die Auszahlung vor, indem sie die Scheine dem Vorrat entnimmt und hinausreicht. Sind die Scheine nicht mehr vorhanden, wird als erster Wert im Rückgabepaar eine "-1" zurückgeliefert.

  def auszahlung(self, betrag):
    f, h = self.scheine(betrag)
    if self.fuenfziger >= f and self.hunderter >= h:
        self.fuenfziger = self.fuenfziger - f
        self.hunderter = self.hunderter - h
        return (f, h)
    return (-1, 0)

Jetzt noch der laufende Betrieb:

  def betrieb(self):
    while 1:
        print 'Herzlich Willkommen bei dem Geldinstitut',
        print 'Ihres Vertrauens!'
        print 'Bitte wählen Sie den Zahlbetrag:'
        print '  50 DM     400 DM'
        print ' 100 DM     500 DM'
        print ' 150 DM     600 DM'
        print ' 200 DM     800 DM'
        print ' 300 DM    1000 DM'
        print
        print 'Bitte den vollen DM-Betrag ohne',
        print 'Währung eingeben!'
        geldbetrag = eval(raw_input())
        scheine = self.auszahlung(geldbetrag)
        if scheine[0] == -1:
                print 'Dieser Geldbetrag ist leider nicht',
                print 'mehr verfügbar.'
                print 'Dieser Geldautomat ist nun',
                print 'geschlossen.'
                print 'Der nächste Automat steht um die Ecke.'
                print 'Wir danken für Ihren Besuch!'
                break
        print '>>>>'
        print 'Auszahlung: %d Scheine zu 50 DM' % scheine[0],
        print 'und %d Scheine zu 100 DM.' % scheine[1]
        print 'Vielen Dank für Ihren Besuch!'
        print
        print

Das war's!


Der Code bis hierher stand in der Datei "klasse3.py"!

So, nun wollen wir die Maschine mal in Betrieb nehmen:


from klassen3 import Bankomat

mat = Bankomat()
mat.betrieb()

Damit kennt der Interpreter auch alle Prozedurnamen der Klasse, sie müssen nicht mehr einzeln importiert werden.
Erst mal arbeiten wir mit der Standardbefüllung

Das ist alles.


[ Übersicht | vorige Seite | nächste Seite | Ganz oben ]

©   W. Arnhold Oktober 2000