Fehler (kurzes Programm)

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
Pit55
User
Beiträge: 6
Registriert: Freitag 13. Dezember 2019, 17:19

Hallo,
ich eigne mir gerade Python an. Bei einem kleinen Beispielprogramm komme ich nicht weiter. Es ist im Grunde etwas ganz simples.
Das unten stehende Programm soll ausgeführt werden. Dieses Programm soll aus s=Bruch(4,8) auf der Konsole einfach nur "4/8" machen (also den Bruch in dieser Darstellung ausgeben). Wenn ich das Programm über Vidual Studio ausführe kommt:

<__main__.Bruch object at 0x0000029083602208>
Press any key to continue . . .


ähnlich läuft es wenn ich es über die Eingabeaufforderung von Windows oder die direkte Python-Eingabeaufforderung (runtergeladen) mache.
Eigentlich sollte dann aber laut meinem Buch etwas anderes rauskommen:

>>> from brueche import Bruch # das Programm wurde als brueche.py gespeichert
>>> x = Bruch(2,3)
>>> print(x)
2/3


Code: Alles auswählen

class Bruch(object):

    def __init__(self,z,n):
        self.zaehler = z
        self.nenner = n

if __name__ == "__main__":
    x = Bruch(1,3)
    y = Bruch(2,5)
    def __str__(self):
        return str(self.zaehler) + '/' + str(self.nenner)

s=Bruch(4,8)
print(s)
aus dem Buch:
Bild

Weiß einer warum das so ist?
Vielen Dank.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Naja, steht doch da. Ein bisschen unglücklich gelayoutet. Die __str__ Methode fehlt Deiner Bruch Klasse.
Pit55
User
Beiträge: 6
Registriert: Freitag 13. Dezember 2019, 17:19

Danke für die schnelle Antwort. Wo soll das stehen? Oder kann man das aus der Meldung <__main__.Bruch object at 0x0000029083602208>
Press any key to continue . . .
herauslesen?

Und in meinem Code habe ich sie doch definiert:

Code: Alles auswählen

def __str__(self):
        return str(self.zaehler) + '/' + str(self.nenner)
Vielen Dank.
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Wenn irgendetwas "Methode" heißt, dann gehört es zu einer Klasse, sonst ist es eine Funktion. Du hast jetzt eine Funktion def __str__(self) definiert, die im Code so für sich alleine steht und niemals aufgerufen wird.

Entweder hast du im Buch etwas überlesen - oder noch nicht ganz verstanden - oder das Buch ist didaktisch eher unglücklich aufgebaut.

Schau dir mal an was ausgegeben wird wenn du folgenden Code ausführst.

Code: Alles auswählen

class Ding:
    def __init__(self, name):
        self.name = name
    def __str__(self):
        return f'Ich bin {self.name}'

hero = Ding('Groot')
print(str(hero))
Alternativ dazu folgender Code in dem __str__ nicht mehr zur Klasse gehört (man beachte die Einrückung):

Code: Alles auswählen

class Ding:
    def __init__(self, name):
        self.name = name
def __str__(self):
    return f'Ich bin {self.name}'

hero = Ding('Groot')
print(str(hero))
Im zweiten Fall wird die Default __str__-Methode von Ding aufgerufen und die gibt halt das aus was du da siehst.
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Wie du am Beispiel von /me siehst, verwendet er für die Ausgabe schon f-Strings, statt die Variablen einzeln zu konvertieren und mit "+" zusammen zu stückeln. Bei deinem Beispiel würde das so aussehen:

Code: Alles auswählen

    def __str__(self):
        return f"{self.zaehler}/{self.nenner}"

Auch musst du ab Python3 bei einer Klasse nicht mehr object explizit als Elterklasse angeben.
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Das Buch benutzt ja noch Python 3.5, da hätte der Autor

Code: Alles auswählen

class Bruch:
    def __init__(self, zaehler, nenner):
        self.zaehler = zaehler
        self.nenner = nenner

    def __str__(self):
        return "{}/{}".format(self.zaehler, self.nenner)
schreiben müssen. Aber Druckertinte ist teuer, so das man an der Länge der Variablennamen sparen muss. Den __main__-Block, der nichts macht, hätte er sich aber sparen können.
Antworten