__str__
i __repr__
to obie metody uzyskiwania reprezentacji łańcuchowej obiektu. __str__
ma być krótszy i bardziej przyjazny dla użytkownika, podczas gdy __repr__
ma dostarczyć więcej szczegółów.
W szczególności w przypadku wielu typów danych __repr__
zwraca ciąg znaków, który po wklejeniu go z powrotem do Pythona byłby prawidłowym wyrażeniem, którego wartość byłaby równa wartości pierwotnej. Na przykład: str('Hello')
zwraca 'Hello'
, ale repr('Hello')
zwraca "'Hello'"
, z cudzysłowami wewnątrz łańcucha. Jeśli wydrukujesz ten ciąg, otrzymasz 'Hello'
, a jeśli wkleisz go z powrotem do Pythona, otrzymasz oryginalny ciąg z powrotem.
Niektóre typy danych, takie jak obiekty plików, nie mogą być w ten sposób konwertowane na ciągi. Metody takich obiektów zwykle zwracają łańcuch w nawiasach ostrych, który obejmuje typ danych obiektu i adres pamięci. Zdefiniowane przez użytkownika klasy również to zrobić, jeśli nie zdefiniowano konkretnie metody __repr__
.
Podczas obliczania wartości w REPL, Python wywołuje __repr__
, aby przekonwertować go na ciąg znaków. Jednak przy korzystaniu z print
, Python wywołuje __str__
.
Po wywołaniu print((Item("Car"),))
, wywołujesz metodę __str__
klasy tuple
, która jest taka sama, jak jej metoda __repr__
. Ta metoda działa, wywołując metodę __repr__
każdego elementu w krotce, łącząc je razem z przecinkami (plus końcową dla krotki z jednym elementem) i otaczając całą rzecz nawiasami. Nie jestem pewien, dlaczego metoda __str__
z tuple
nie wywołuje jej zawartości pod numerem __str__
, ale tak się nie dzieje.
Pokonaj mnie! :) http://docs.python.org/2/reference/datamodel.html#object.__repr__ –
Bicie mnie też! Warto jednak dodać, że "__repr__" zwykle jest instrukcją, która odtwarzałaby obiekt. Z dokumentacji: "powinno to wyglądać jak poprawne wyrażenie w Pythonie, które może być użyte do odtworzenia obiektu o tej samej wartości". –
... I zdałem sobie sprawę, że całkowicie pominąłem faktyczny punkt pytania. Naprawiony. – Taymon