Klassen erstellen Konto-Art mit Methoden

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
rangiurei
User
Beiträge: 2
Registriert: Mittwoch 22. Dezember 2021, 03:21

Hallo zusammen,

Ich habe eine Schulaufgabe erhalten in der ich Klassen erstellen soll, als Konto bezeichnet und diverse Methoden haben muss. (Ich hänge die Aufgabe an) kann mir jemand helfen wo ich eine Anleitung finde oder mir jemand die Aufgabe erklären kann?

Freundliche Grüsse



Erfahrungsaufgabe

Erstellen Sie eine Klasse Konto, die sowohl Konten (mit einer kontonummer) und aktuelles Guthaben(kontostand) verwaltet. Diese Klasse verwaltet auch den geldbestand der Bank, welcher einen Anfangswert von 1000€
hat. Diese Klasse hat folgenden Methoden:
  • • geldAbheben(betrag): betrag wird vom kontostand abgezogen
    • geldEinzahlen(betrag): betrag wird dem kontostand hinzugefügt. Gleichzeitig
    wird der geldbestand der Bank um diesen betrag erhöht
    • kontostandAnzeigen(): aktueller kontostand wird ausgegeben
    • geldbestandAnzeigen(): aktueller geldbestand der Bank wird ausgegeben
    • kontostandAktuell(): liefert den aktuellen kontostand zurück
Pluskonto ist eine abgeleitete Klasse der Klasse Konto.

Diese Klasse überschreibt die Methode geldAbheben(betrag) wie folgt:
• Wenn der kontostand weniger als den betrag ist, dann wird den kontostand um diesen betrag reduziert, sonst nicht und wird eine Warnmeldung ausgegeben

Die 2 Klassen haben eine __str__ Methode, die eine benutzerfreundliche Darstellung des Objektes als String ausgibt
Erstellen Sie 2 Objekte und testen Sie alle erstellten Methoden
Sirius3
User
Beiträge: 18279
Registriert: Sonntag 21. Oktober 2012, 17:20

Und an welcher Stelle kommst Du nicht weiter? Ihr habt ja sicher schon ähnliche Klassen kennengelernt, da ist ja das Grundgerüst immer das selbe.

Im deutschen gibt es eine Schreibweise, dass Substantive groß geschrieben werden, Kontostand, oder Betrag. In Python gilt die Schreibweise, dass Variablennamen und Methoden klein geschrieben werden, also geld_abheben oder kontostand_anzeigen.
rangiurei
User
Beiträge: 2
Registriert: Mittwoch 22. Dezember 2021, 03:21

Das ist der erste Teil vom ersten Objekt „Konto“ mit dem ich zufrieden bin, den ich bis jetzt habe. aber beim zweiten Teil „Pluskonto“ kommt eine Fehlermeldung.

class Konto:

def __init__(self, kontonummer, kontostand=0, geldbestand=1000):
self.kontonummer = kontonummer
self.kontostand = kontostand
self.geldbestand = geldbestand
def __str__(self):
return f'Kontonummer: {self.kontonummer}, Kontostand: {self.kontostand} Geldbestand: {self.geldbestand}'

def geldAbheben(self, betrag):
print("betrag wird vom kontostand abgezogen:", betrag)
self.kontostand -= betrag

def geldEinzahlen(self, betrag):
print("betrag wird dem kontostand hinzugefügt:", betrag)
self.kontostand += betrag
self.geldbestand += betrag

def kontostandAnzeigen(self):
print("aktueller kontostand wird ausgegeben: ", self.kontostand)

def geldbestandAnzeigen(self):
print("aktueller geldbestand der Bank wird ausgegeben: ", self.geldbestand)

def kontostandAktuell(self):
return self.kontostand


class Pluskonto(Konto):

def __init__(self, kontonummer, kontostand=0):
Konto.__init__(self, kontonummer, kontostand=0)
def __str__(self):
return f'Kontonummer: {self.kontonummer}, Kontostand: {self.kontostand}'

def geldAbheben(self, betrag):
if self.kontostandAktuell() - betrag >= 0:
print("Abgehobener Betrag vom Pluskonto: ", betrag)
Konto.geldAbheben(betrag)
else:
print("Ihr Saldo ist zu klein")



konto = Konto("45-545697-7")
konto.geldAbheben(100)
konto.geldEinzahlen(20)
konto.kontostandAnzeigen()
konto.geldbestandAnzeigen()
konto.kontostandAktuell()
print(

Zweites Objekt“ Pluskonto“ da bekomme ich eine Fehlermeldung.

pluskonto = Pluskonto("13-873476-3")
pluskonto.geldEinzahlen(20)
pluskonto.kontostandAnzeigen()
pluskonto.geldbestandAnzeigen()
print(pluskonto)
Benutzeravatar
__blackjack__
User
Beiträge: 14078
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@rangiurei: Also wenn ich das halbfertige ``print(`` zu ``print(konto)`` ergänze läuft das bei mir durch:

Code: Alles auswählen

betrag wird vom kontostand abgezogen: 100
betrag wird dem kontostand hinzugefügt: 20
aktueller kontostand wird ausgegeben:  -80
aktueller geldbestand der Bank wird ausgegeben:  1020
Kontonummer: 45-545697-7, Kontostand: -80 Geldbestand: 1020
betrag wird dem kontostand hinzugefügt: 20
aktueller kontostand wird ausgegeben:  20
aktueller geldbestand der Bank wird ausgegeben:  1020
Kontonummer: 13-873476-3, Kontostand: 20
Ohne Fehlermeldung. Also welche bekommst Du? Wo wird die ausgelöst? Am besten 1:1 die Ausnahme mit Traceback im Beitrag zeigen. Und dann ist die nächste Frage was Du an der Fehlermeldung nicht verstehst, also warum dachtest Du würde die an der Stelle nicht kommen? Was sollte stattdessen passieren?

Ansonsten noch ergänzende Anmerkungen: Die Methode `aktuellerKontostand()` beziehungsweise in der korrekten Schreibweise `aktueller_kontostand()` entsprich a) nicht der Konvention das man Methoden nach der Tätigkeit benennt die sie durchführen (die anderen Methoden machen das) und b) schreibt mal in Python solche trivialen Getter-Methoden nicht. Man kann da einfach auf `kontostand` zugreifen, das ist ja der aktuelle Kontostand. Es macht auch gar keinen Sinn, das Du diese Methode im Hauptprogramm aufrufst, weil Du mit dem Rückgabewert dort überhaupt nichts machst.

Die `print()`-Ausgaben und damit auch die beiden Methoden die dazu da sind was auszugeben gehören auch nicht auf eine `Konto`-Klasse und statt einer Ausgabe wenn etwas nicht funktioniert, sollte man das dem Aufrufer kommunizieren. Letztendlich mit einer Ausnahme, aber für Anfänger vielleicht erst einmal dadurch, dass die Methode über einen Rückgabewert anzeigt ob die Aktion erfolgreich war oder nicht.

An der Ausgabe vom Bankgeldbestand sieht man auch sehr schön, dass der bei Konto-Objekten nichts zu suchen hat, weil der dann ja nicht für die ganze Bank gilt, sondern für jedes Konto separat. Die Krönung wäre noch wenn der Lehrer sich da gedacht hat das sollte man als globale Variable auf der Klasse ”lösen”.

Warum Lehrer/Lehrmaterial immer so einen falschen Unsinn zeigen, den man danach dann wieder verlernen muss, ist mir echt ein Rätsel.

Warum überschreibst Du bei `Pluskonto` die `__str__()`-Methode, wiederholst dort Code der auch schon in der `Konto.__str__()` steht, lässt aber andererseits Informationen weg, so dass die Zeichenkettendarstellung eines `Pluskonto` am Ende weniger Informationen enthält als die vom `Konto`‽ Und auch die `__init__()` kann plötzlich weniger. Es gibt keinen Grund diese beiden Methoden zu überschreiben.

Zwischenstand:

Code: Alles auswählen

#!/usr/bin/env python3

START_GELDBESTAND = 1000


class Konto:
    def __init__(
        self, kontonummer, kontostand=0, geldbestand=START_GELDBESTAND
    ):
        self.kontonummer = kontonummer
        self.kontostand = kontostand
        self.geldbestand = geldbestand

    def __str__(self):
        return (
            f"Kontonummer: {self.kontonummer}, Kontostand: {self.kontostand},"
            f" Geldbestand: {self.geldbestand}"
        )

    def abheben(self, betrag):
        print("Betrag wird vom Kontostand abgezogen:", betrag)
        self.kontostand -= betrag

    def einzahlen(self, betrag):
        print("Betrag wird dem Kontostand hinzugefügt:", betrag)
        self.kontostand += betrag
        self.geldbestand += betrag

    def kontostand_anzeigen(self):
        print("Aktueller Kontostand: ", self.kontostand)

    def geldbestand_anzeigen(self):
        print("Aktueller Geldbestand der Bank:", self.geldbestand)


class Pluskonto(Konto):
    def abheben(self, betrag):
        if self.kontostand - betrag < 0:
            print("Ihr Saldo ist zu klein!")
        else:
            Konto.abheben(betrag)
            print("Abgehobener Betrag vom Pluskonto: ", betrag)


def main():
    konto = Konto("45-545697-7")
    konto.abheben(100)
    konto.einzahlen(20)
    konto.kontostand_anzeigen()
    konto.geldbestand_anzeigen()
    print(konto)
    print("-" * 75)
    pluskonto = Pluskonto("13-873476-3")
    pluskonto.einzahlen(20)
    pluskonto.kontostand_anzeigen()
    pluskonto.geldbestand_anzeigen()
    print(pluskonto)


if __name__ == "__main__":
    main()
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten