Python Tutorial
- jetzt Python programmieren lernen

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 folgendes 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, dass passt so :) mit der doppelten Buchführung.