Python Class TypeError ( can only concatenate tuple (not "str") to tuple )

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
zkingnukez
User
Beiträge: 1
Registriert: Mittwoch 5. Juli 2017, 09:16

Hallo,
unzwar habe ich folgendes Script verfasst und verstehe nicht wo der Fehler liegt.

Code: Alles auswählen

class Konto:    
    def __init__(self,Kontostand,Kontoinhaber,Kontokorrent=0):
        self.Kontostand = Kontostand
        self.Kontoinhaber = Kontoinhaber
        self.Kontokorrent = Kontokorrent

    def Geld_einzahlen(Einzahlung,self):
        self.Kontostand += Einzahlung                   #a+=b = a=a+b

    def Geld_auszahlen(Auszahlung,self):
        self.Kontostand -= Auszahlung

    def Kontostand_ueberpruefen(self):
        return self.Kontostand

    def Kontoauszug(self):
        return self.Kontoinhaber ,"hat", self.Kontostand ,"€ auf seinem Konto"

    def ueberweisen(self, ziel, betrag):
        if(self.Kontostand - betrag < -self.Kontokorrent):
            print "Deckung nicht genuegend"
            # Deckung nicht genuegend
            return False 
        else: 
            self.Kontostand -= betrag 
            ziel.Kontostand += betrag 
            return True
         
class Kreditkonto(Konto):
    
    def __init__(self,Kontostand,Kontoinhaber,Kredit,Kontokorrent=0):
        Konto.__init__(self,Kontostand,Kontoinhaber,Kontokorrent)
        self.Kredit = Kredit

    def Kontoauszug(self):
        return Konto.Kontoauszug(self) + "und der Kreditrahmen liegt bei" + self.Kredit

if __name__ == "__main__":   
    x = Kreditkonto("1000","Martin L.","500")
    print x.Kontoauszug()

()

Der Error:
[error] script [ *Kontostand ] stopped with error in line 40
[error] TypeError ( can only concatenate tuple (not "str") to tuple )
[error] --- Traceback --- error source first line: module ( function ) statement 36: main ( Kontoauszug ) return Konto.Kontoauszug(self) + "und der Kreditrahmen liegt bei" + self.Kredit
[error] --- Traceback --- end --------------

Danke im Vorhinein

MFG
Zuletzt geändert von Anonymous am Mittwoch 5. Juli 2017, 10:18, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Der Fehler liegt darin, dass die Basisklasse ein Tuple für den Kontoauszug zurückgibt und du dieses Tuple in der abgeleiteten Klasse mit einem String verknüpfen willst. Entweder du gibst dort auch ein Tuple zurück oder du schaust dir mal String Formatting an. Mit String Formatting wäre es so:

Code: Alles auswählen

return '{} hat {}€ auf seinem Konto'.format(self.Kontoinhaber, self.Kontostand)
BlackJack

@zkingnukez: Da sind auch noch ein paar andere Fehler drin. Schau Dir mal die Argumente bei den Methoden an. Das Objekt selbst muss immer das *erste* Argument sein.

Beim auszahlen wird nichts geprüft, aber beim Überweisen ob die Deckung ausreicht. Diese prüfung gehört zum Auszahlen und überweisen würde dann nicht direkt auf den Kontoständen operieren, sondern die Methoden zum auszahlen und einzahlen verwenden. Und anstelle eines Fehlerwertes würde man mit Ausnahmen arbeiten.

Beim Erzeugen des `Kreditkonto`-Objekts übergibst Du Zeichenketten anstelle von Zahlen.

Die Namensschreibweisen und teilweise die Leerzeichensetzung halten sich nicht an den Style Guide for Python Code.

`Kontostand_ueberpruefen()` macht nichts sinnvolles.

Die Argumente `Einzahlung` und `Auszahlung` beim ein- und auszahlen würde ich `betrag` nennen. `Einzahlung` und `Auszahlung` sind ja eher Vorgänge und nicht der, nun ja Betrag, der dort übergeben wird.

Funktionen und Methoden werden in der Regel nach der Tätigkeit benannt die sie verrichten und `Kontoauszug` ist keine Tätigkeit. Hinter dem Namen würde man eher ein Objekt erwarten das einen Kontoauszug repräsentiert. Und in der Schreibweise mit dem grossen K eigentlich eine Klasse. Auf der Suche nach einem besseren Namen tue ich mich jetzt auch mit Deutsch schwer, denn eine gute Übersetzung für `get_statement()` fällt mir jetzt nicht ein. Das klingt alles irgendwie falsch, weil man Programme normalerweise nicht auf Deutsch schreibt. Vielleicht `erstelle_kontoauszug()`‽

`x` ist kein passender Name für ein Kreditkonto. `kreditkonto` wäre ein Naheliegender.
Antworten