Seite 1 von 1

special methods

Verfasst: Mittwoch 11. Oktober 2023, 16:26
von mechanicalStore
Hallo Zusammen,

statt Programmieren gehe ich im Moment mal wieder meiner Lieblingsbeschäftigung nach, zu analysieren, warum manche Dinge so sind wie sie sind - und ich sie nicht verstehe. In einem älteren thread - nämlich hier: viewtopic.php?t=54719 - geht es um folgende Codeschnipsel:

Code: Alles auswählen

    def __repr__(self):
        return (
            f"{self.__class__.__name__}"
            f"({self.project!r}, {self.date!r}, {self.start!r}, {self.stop!r})"
        )

    def __str__(self):
        return self.DELIMITER.join(
            [self.project, self.date, self.start, self.stop]
        )
Diese waren von Dir, __blackjack__ und auf meine damalige Frage nach __repr__ hattest Du das geantwortet:
Entry.__repr__()` wird von `list.__repr__()` benutzt, das wiederum von `list.__str__()` verwendet wird, das vom `print()` verwendet wird das in der letzten Zeile von `main()` steht.
Leider bis heute nicht richtig kapiert. In der Doku steht dazu, dass __str__ von str() oder print() verwendet wird, und __reper__ von repr(). Soweit sogut. Weiterhin steht da, dass __repr__ eigentlich nur zu Debug-Zwecken verwendet wird , weil es gegenüber __str__ erweiterte informationen liefert.

In Deinem Antwortsatz steht aber, dass das jeweils eine von dem anderen benutzt wird. Dazu habe ich keinen Hinweis gefunden, oder es halt nicht richtig kapiert, was Du meinst. Wo kann man das nachlesen, dass Entry__repr__() von list.__repr__() benutzt wird, oder besser, ich habe bei list keinerlei Hinweis auf __repr__ gefunden. Ebenso keinen Hinweis, dass __list__.str() von list.__repr() benutzt wird, in der Doku werden diese Dinge komplett auseinander gehalten.

Ebenso die Frage, wieso überhaupt die special methods hinter den eigentlichen Methoden liegen, also warum nicht gleich repr() neu definieren, anstatt __repr__ ?

Und warum steht das !r da drin, wo wir uns doch sowieso innerhalb der __repr__ methode befinden?

Wie (und warum) geht man grundsätzlich mit diesen Methoden um, z.B. mit __mul__ ? Sind diese (mathematischen) methoden z.B. nur dazu da, um z.B. ähnlich C++ die Operatoren zu überladen?

Danke und Gruß

Re: special methods

Verfasst: Mittwoch 11. Oktober 2023, 19:13
von Sirius3
In der Doku steht zu __str__ das:
https://docs.python.org/3/reference/datamodel.html#object.__str__ hat geschrieben:The default implementation defined by the built-in type object calls object.__repr__().
Und weil die Argumente in der __repr__-Darstellung wieder eine Repräsentation sein sollten, muß im Formatstring !r benutzt werden, um die Argumente richtig zu formatieren.

In Python gibt es kein Überladen von Funktionen (im Ggs zu C++). Das heißt, man müßte in jedem neu definierten repr alle Varianten berücksichtigen, da ist es viel einfacher, Objektoriertierung zu benutzen.

Und ja, diese __-Methoden sind die Art, wie man Operatoren in Python definiert.