2013-08-23 13 views
7

piszę ten kod:Różnica między __str__ a __repr__?

class Item: 
    def __init__(self, name): 
     self._name = name; 
    def __str__(self): 
     return "Item: %s" % self._name 

Kiedy biegnę

print((Item("Car"),)) 

wyjście jest

(<__main__.Item object at 0x0000000002D32400>,) 

Kiedy zmienić kod do tego:

class Item: 
    def __init__(self, name): 
     self._name = name; 
    def __repr__(self): 
     return "Item: %s" % self._name 
    def __str__(self): 
     return "Item: %s" % self._name 

gon wyjścia

(Item: Car,) 

Więc teraz jestem mylić o różnicę między __repr__ i __str__.

Odpowiedz

16

__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.

+0

Pokonaj mnie! :) http://docs.python.org/2/reference/datamodel.html#object.__repr__ –

+0

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". –

+0

... I zdałem sobie sprawę, że całkowicie pominąłem faktyczny punkt pytania. Naprawiony. – Taymon