Klassen auslagern
Unsere erstellten Klassen benötigen Platz und wenn alles sich in einer Datei befindet, wird es unübersichtlich. Daher ist eine gute Vorgehensweise, die Klassen als Module auszulagern und einfach zu importieren.
Aus dem Bank-Beispiel aus dem letzten Kapitel machen wir ein Modul. Der Modulname ist „konto.py“. Die Benennung ist sehr wichtig, da wir beim Import die Datei in der Form from konto import Konto
ohne Dateiendung „.py“ angeben!
Der Inhalt der Datei „konto.py“ – vorneweg der DOCstring für die Hilfe nicht vergessen:
""" Klasse Konto und Pluskonto zum verwalten, ein- und auszahlen von Bankkonten """
class Konto:
""" unsere kleines Bankprogramm zum Verwalten Konten/Geld """
__geldbestand = 0
def __init__(self, kontonummer, kontostand=0):
self.__kontonummer = kontonummer
self.__kontostand = kontostand
def geld_abheben(self, betrag):
print("Geld wird abgehoben:", betrag)
self.__kontostand -= betrag
Konto.__geldbestand -= betrag
def geld_einzahlen(self, betrag):
print("Geld wird eingezahlt:", betrag)
self.__kontostand += betrag
Konto.__geldbestand += betrag
def kontostand_anzeigen(self):
print("aktueller Kontostand: ", self.__kontostand)
print("aktueller Geldbestand der Bank: ", Konto.__geldbestand, "\n")
def kontostand_aktuell(self):
return self.__kontostand
class Pluskonto(Konto):
""" ein Konto, dass nicht überzogen werden kann """
def __init__(self, kontonummer, kontostand=0):
""" Initalisieren über Eltern-Klasse """
super().__init__(kontonummer, kontostand=0)
def geld_abheben(self, betrag):
print("Geld soll vom Pluskonto abgehoben werden:", betrag)
print("Maximal verfügbar ist gerade:", self.kontostand_aktuell())
if self.kontostand_aktuell() - betrag >= 0:
print("Auszahlen von Pluskonto: ", betrag)
super().geld_abheben(betrag)
else:
print("Sorry, Konto kann nicht überzogen werden!")
Und jetzt stehen und 5 Varianten zum Import zur Verfügung:
# eine von den 5 wählen!
from konto import *
# oder
from konto import Konto
# oder
from konto import Pluskonto
# oder
from konto import Konto, Pluskonto
# oder
import konto
Warum gibt es da so viel Auswahl? Wir haben in unserem Modus sowohl die Klasse „Konto“ wie die Klasse „Pluskonto“.
from konto import Konto
Über die Anweisung from konto import Konto
sagen wir, lade die Datei „konto.py“ und verwende die Klasse „Konto“. Die Kindklasse „Pluskonto“ steht nicht zur Verfügung und wir bekommen eine Fehlermeldung beim Aufruf der Klasse „Pluskonto“.
from konto import Konto
# funktioniert
kunde_minderjaehrig = Konto("0000935")
# FEHLERMELDUNG NameError: name 'Pluskonto' is not defined
kunde_minderjaehrig = Pluskonto("0000935")
from konto import Pluskonto
Über die Anweisung from konto import Pluskonto
laden wir aus dem Modul „konto“ nur das Pluskonto und können auch dieses nutzen (auch wenn dieses Intern auf Konto zugreift):
from konto import Pluskonto
# FEHLERMELDUNG (und bricht dann ab, das Zugriff unten würde funktionieren
kunde_minderjaehrig = Konto("0000935")
# funktioniert
kunde_minderjaehrig = Pluskonto("0000935")
import konto
Über die Anweisung import konto
laden wir das gesamte Modul, allerdings müssen wir mit dem Aufruf „Modulname.klassenname“ auf die Klassen zugreifen!
import konto
# Zugriff über "Modulname.klassenname"!
kunde_minderjaehrig = konto.Konto("0000935")
# bzw.
kunde_minderjaehrig = konto.Pluskonto("0000935")
from konto import *
Über die Anweisung from konto import *
laden wir beide Modul, die wir dann nutzen können. Im Vergleich zum import konto
(siehe Punkt davor) müssen wir keine weiteren Angaben machen!
from konto import *
# funktioniert
kunde_minderjaehrig = Konto("0000935")
# funktioniert
kunde_minderjaehrig = Pluskonto("0000935")
Macht man ungern um Namenskonflikte zu vermeiden und man sieht auch so nicht, welche Klassen eigentlich genutzt werden. Daher besser gleich folgende Variante!
from konto import Konto, Pluskonto
Über die Anweisung from konto import Konto, Pluskonto
laden wir beide Modul, die wir dann nutzen können:
from konto import Konto, Pluskonto
# funktioniert
kunde_minderjaehrig = Konto("0000935")
# funktioniert
kunde_minderjaehrig = Pluskonto("0000935")
Fertiger Code in auszuführender Datei
Und hier nun unser fertiger Code mit der Variante für den Import beider Klassen:
from konto import Konto, Pluskonto
kunde_schulz = Konto("000111555")
kunde_schulz.kontostand_anzeigen()
kunde_schulz.geld_einzahlen(400)
kunde_schulz.geld_abheben(150)
kunde_schulz.kontostand_anzeigen()
kunde_minderjaehrig = Pluskonto("0000935")
kunde_minderjaehrig.kontostand_anzeigen()
kunde_minderjaehrig.geld_einzahlen(200)
kunde_minderjaehrig.geld_abheben(101)
kunde_minderjaehrig.kontostand_anzeigen()
Als Ausgabe erhalten wir:
aktueller Kontostand: 0
aktueller Geldbestand der Bank: 0
Geld wird eingezahlt: 400
Geld wird abgehoben: 150
aktueller Kontostand: 250
aktueller Geldbestand der Bank: 250
aktueller Kontostand: 0
aktueller Geldbestand der Bank: 250
Geld wird eingezahlt: 200
Geld soll vom Pluskonto abgehoben werden: 101
Maximal verfügbar ist gerade: 200
Auszahlen von Pluskonto: 101
Geld wird abgehoben: 101
aktueller Kontostand: 99
aktueller Geldbestand der Bank: 349
Wer nachrechnen will, das passt mit der doppelten Buchführung so :).