Verständnisfrage zu __str__

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
CasualCoding.org

Hallo Forum!

In meinem Lehrbuch steht folgendes Beispielskript:

Code: Alles auswählen

class Stammbaum:
    def __init__(self, name, vater, mutter):
        self.name = name
        self.vater = vater
        self.mutter = mutter

    def __str__(self):
        s = ""
        if self.name:
            s += self.name + '\n'
            if self.mutter:
                s += 'Mutter von ' + self.name + ': ' + str(self.mutter)
            if self.vater:
                s += 'Vater von ' + self.name + ': ' + str(self.vater)
        return s

sarah = Stammbaum('Sarah', None, None)
willy = Stammbaum('Willy', None, None)
marianne = Stammbaum('Marianne', None, None)
anton = Stammbaum('Anton', None, None)
marlene = Stammbaum('Marlene', willy, sarah)
werner = Stammbaum('Werner', anton, marianne)
jenny = Stammbaum('Jenny', werner, marlene)
print(jenny)
Die Ausgabe ist:

Code: Alles auswählen

Jenny
Mutter von Jenny: Marlene
Mutter von Marlene: Sarah
Vater von Marlene: Willy
Vater von Jenny: Werner
Mutter von Werner: Marianne
Vater von Werner: Anton
Was ich nun nicht recht verstehe: Im Skript wird ja __str__ überschrieben, so dass die Stringrepräsentation so aussieht:

Name
Mutter von Name: Name
Vater von Name: Name

Innerhalb der __str__ Methode wird selbige dann für die Elternteile rekursiv aufgerufen. Warum aber fehlt bei der Ausgabe der Elternteile die Zeile, in der nur der Name der Person steht? Müsste die Ausgabe nicht eher so aussehen? :

Code: Alles auswählen

Jenny
Mutter von Jenny: Marlene
[b]Marlene[/b]
Mutter von Marlene: Sarah
Vater von Marlene: Willy
Vater von Jenny: Werner
[b]Werner[/b]
Mutter von Werner: Marianne
Vater von Werner: Anton
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Nein, die Ausgabe von `self.name` bei den Elternteilen fehlt nicht. Du erwartest, dass der `self.name` 2x ausgegeben wird, das sagt der Code aber nicht ;)
BlackJack

@SolitaryMan: Nein warum? Die Ausgabe fehlt auch nicht, die steht doch jeweils nach dem Doppelpunkt dort!
CasualCoding.org

Aber nach dem Doppelpunkt wird doch mit str(self.mutter) wieder die Methode __str__ aufgerufen, und die beginnt doch mit dem Namen und einem Zeilenumbruch!?
BlackJack

@SolitaryMan: Ja genau. Und warum erwartest Du einen Zeilenumbruch *vor* dem Namen? Der steht doch eindeutig *nach* dem Namen.
CasualCoding.org

@BlackJack: *kopf* -> *tisch*

Klar, Mann. Danke! :)
Antworten