Dla programistów Java, którzy uczą się Pythona, najlepszym sposobem spojrzenia na to jest toString () w Javie.
Ravi
Odpowiedzi:
188
__repr__powinien zwrócić drukowalną reprezentację obiektu, najprawdopodobniej jeden z możliwych sposobów utworzenia tego obiektu. Zobacz oficjalną dokumentację tutaj . __repr__jest bardziej dla programistów, a __str__dla użytkowników końcowych.
Prosty przykład:
>>>classPoint:...def __init__(self, x, y):... self.x, self.y = x, y
...def __repr__(self):...return'Point(x=%s, y=%s)'%(self.x, self.y)>>> p =Point(1,2)>>> p
Point(x=1, y=2)
lazy1: Przede wszystkim chciałem naprawić formatowanie (przydatne jest, aby przykłady były jak najbliższe temu, co zobaczą w przykładowej sesji), ale dostosowałem również format wyjściowy, aby wyraźnie różnił się od przypisania, ponieważ znacznie poprawia przejrzystość dla kogoś, kto jest zdezorientowany, imho. (Jeśli zaszedłem za daleko, po prostu przeredaguj, a będę ci winien piwo.)
To nie jest tak naprawdę poprawne. __str__jest wyjściem, które powinno być czytelne dla człowieka: __repr__powinno być reprezentacją możliwą do odczytania dla interpretera Pythona (tzn. podanie ciągu do interpretera powinno odtworzyć obiekt). Jeśli jednak obiekt nie ma __str__metody, __repr__jest używany zamiast tego. Jak zauważono: ten przykład faktycznie wypisuje __str__metodę self.xand self.y: %rpowinno być użyte zamiast %sw operacji formatowania łańcucha (ponieważ klasa nie definiuje __str__, w __repr__rzeczywistości jest zwracana, ale jest to anomalia).
repr ( obiekt ): Zwraca ciąg zawierający drukowalną reprezentację obiektu. Jest to ta sama wartość, jaką dają konwersje (odwrotne cudzysłowy). Czasami warto mieć dostęp do tej operacji jako zwykłej funkcji. W przypadku wielu typów funkcja ta podejmuje próbę zwrócenia ciągu znaków, który dałby obiekt o tej samej wartości po przekazaniu do eval(), w przeciwnym razie reprezentacja jest łańcuchem zamkniętym w nawiasach ostrych, który zawiera nazwę typu obiektu wraz z dodatkowymi informacjami często zawiera nazwę i adres obiektu. Klasa może kontrolować, co ta funkcja zwraca dla swoich instancji, definiując __repr__()metodę.
Widzisz tutaj domyślną implementację __repr__, która jest przydatna do serializacji i debugowania.
Myślę, że metoda odwróconych cudzysłowów (lub „odwrotnych znaków”) uzyskiwania „reprezentacji” obiektu jest przestarzała i została usunięta w wersji 3.0
MatrixFrog
MatrixFrog: oba są prawdziwe, ale obecna dokumentacja 2.x nadal mówi to, skąd pochodzi cytat.
W przypadku wielu obiektów __repr__ i __str__ pełnią tę samą funkcję. W rzeczywistości, jeśli zdefiniujesz tylko __str__, wówczas __repr__ domyślnie po prostu wywoła __str__. Najbardziej oczywistym przypadkiem, w którym nie jest to prawdą, są same łańcuchy: str ('stackoverflow') zwraca, stackoverflowale repr ('stackoverflow') tak 'stackoverflow'.
MatrixFrog
6
Masz to od tyłu, __repr__ nigdy nie używa __str__, ale może się zdarzyć odwrotnie. Zobacz docs.python.org/reference/…
13
__repr__jest używany przez samodzielny interpreter języka Python do wyświetlania klasy w formacie drukowalnym. Przykład:
~> python3.5
Python 3.5.1 (v3.5.1:37a07cee5969, Dec 5 2015, 21:12:44)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> class StackOverflowDemo:
... def __init__(self):
... pass
... def __repr__(self):
... return '<StackOverflow demo object __repr__>'
...
>>> demo = StackOverflowDemo()
>>> demo
<StackOverflow demo object __repr__>
W przypadkach, gdy __str__metoda nie jest zdefiniowana w klasie, wywoła __repr__funkcję w celu utworzenia reprezentacji do druku.
Zwroty z repr()i str()są identyczne dla int x, ale istnieje różnica między wartościami zwracanymi dla stry- jedna jest formalna, a druga nieformalna . Jedną z najważniejszych różnic między reprezentacjami formalnymi i nieformalnymi jest to, że domyślną implementację __repr__wartości str można wywołać jako argument funkcji eval, a wartość zwracana byłaby prawidłowym obiektem typu string, na przykład:
Kiedy tworzymy nowe typy, definiując klasy, możemy skorzystać z pewnych funkcji Pythona, aby uczynić nowe klasy wygodniejszymi w użyciu. Jedną z tych cech są „metody specjalne”, zwane również „metodami magicznymi”.
Metody specjalne mają nazwy zaczynające się i kończące dwoma podkreśleniami. Definiujemy je, ale zwykle nie nazywamy ich bezpośrednio po imieniu. Zamiast tego są wykonywane automatycznie w określonych okolicznościach.
Wygodne jest, aby móc wyprowadzić wartość wystąpienia obiektu za pomocą instrukcji print. Gdy to robimy, chcielibyśmy, aby wartość była reprezentowana w wyniku w jakimś zrozumiałym i jednoznacznym formacie. Repr sposób szczególny mogą być wykorzystane do zorganizowania tak się stało. Jeśli zdefiniujemy tę metodę, może ona zostać wywołana automatycznie, gdy wydrukujemy wartość wystąpienia klasy, dla której zdefiniowaliśmy tę metodę. Należy jednak wspomnieć, że istnieje również specjalna metoda str , używana w podobnym, ale nie identycznym celu, która może mieć pierwszeństwo, jeśli ją również zdefiniujemy.
Jeśli nie zdefiniowaliśmy metody repr dla klasy Point3D i utworzyliśmy instancję my_point jako instancję Point3D, a następnie robimy to ...
wypisz my_point ... możemy zobaczyć to jako wynik ...
Niezbyt ładne, co?
Dlatego definiujemy specjalną metodę repr lub str lub obie, aby uzyskać lepszy wynik.
**classPoint3D(object):def __init__(self,a,b,c):
self.x = a
self.y = b
self.z = c
def __repr__(self):return"Point3D(%d, %d, %d)"%(self.x, self.y, self.z)def __str__(self):return"(%d, %d, %d)"%(self.x, self.y, self.z)
my_point =Point3D(1,2,3)print my_point # __repr__ gets called automaticallyprint my_point # __str__ gets called automatically**
Zaimplementuj repr dla każdej implementowanej klasy. Nie powinno być wymówki. Zaimplementuj str dla klas, o których myślisz, że czytelność jest ważniejsza niż niejednoznaczność.
>>> variable
drukuje to, co__repr__()
zwraca?Odpowiedzi:
__repr__
powinien zwrócić drukowalną reprezentację obiektu, najprawdopodobniej jeden z możliwych sposobów utworzenia tego obiektu. Zobacz oficjalną dokumentację tutaj .__repr__
jest bardziej dla programistów, a__str__
dla użytkowników końcowych.Prosty przykład:
źródło
__str__
jest wyjściem, które powinno być czytelne dla człowieka:__repr__
powinno być reprezentacją możliwą do odczytania dla interpretera Pythona (tzn. podanie ciągu do interpretera powinno odtworzyć obiekt). Jeśli jednak obiekt nie ma__str__
metody,__repr__
jest używany zamiast tego. Jak zauważono: ten przykład faktycznie wypisuje__str__
metodęself.x
andself.y
:%r
powinno być użyte zamiast%s
w operacji formatowania łańcucha (ponieważ klasa nie definiuje__str__
, w__repr__
rzeczywistości jest zwracana, ale jest to anomalia).Jest to dość dobrze wyjaśnione w dokumentacji Pythona :
Widzisz tutaj domyślną implementację
__repr__
, która jest przydatna do serializacji i debugowania.źródło
stackoverflow
ale repr ('stackoverflow') tak'stackoverflow'
.__repr__
jest używany przez samodzielny interpreter języka Python do wyświetlania klasy w formacie drukowalnym. Przykład:W przypadkach, gdy
__str__
metoda nie jest zdefiniowana w klasie, wywoła__repr__
funkcję w celu utworzenia reprezentacji do druku.Ponadto
print()
klasa wywoła__str__
domyślnie.Dokumentacja , proszę
źródło
Metoda __repr__ po prostu mówi Pythonowi, jak drukować obiekty klasy
źródło
Przykład pokazujący różnice między nimi (skopiowałem z tego źródła ),
Zwroty z
repr()
istr()
są identyczne dlaint x
, ale istnieje różnica między wartościami zwracanymi dlastr
y
- jedna jest formalna, a druga nieformalna . Jedną z najważniejszych różnic między reprezentacjami formalnymi i nieformalnymi jest to, że domyślną implementację__repr__
wartości str można wywołać jako argument funkcji eval, a wartość zwracana byłaby prawidłowym obiektem typu string, na przykład:Jeśli spróbujesz wywołać zwracaną wartość
__str__
jako argument do eval, wynik nie będzie prawidłowy.źródło
Kiedy tworzymy nowe typy, definiując klasy, możemy skorzystać z pewnych funkcji Pythona, aby uczynić nowe klasy wygodniejszymi w użyciu. Jedną z tych cech są „metody specjalne”, zwane również „metodami magicznymi”.
Metody specjalne mają nazwy zaczynające się i kończące dwoma podkreśleniami. Definiujemy je, ale zwykle nie nazywamy ich bezpośrednio po imieniu. Zamiast tego są wykonywane automatycznie w określonych okolicznościach.
Wygodne jest, aby móc wyprowadzić wartość wystąpienia obiektu za pomocą instrukcji print. Gdy to robimy, chcielibyśmy, aby wartość była reprezentowana w wyniku w jakimś zrozumiałym i jednoznacznym formacie. Repr sposób szczególny mogą być wykorzystane do zorganizowania tak się stało. Jeśli zdefiniujemy tę metodę, może ona zostać wywołana automatycznie, gdy wydrukujemy wartość wystąpienia klasy, dla której zdefiniowaliśmy tę metodę. Należy jednak wspomnieć, że istnieje również specjalna metoda str , używana w podobnym, ale nie identycznym celu, która może mieć pierwszeństwo, jeśli ją również zdefiniujemy.
Jeśli nie zdefiniowaliśmy metody repr dla klasy Point3D i utworzyliśmy instancję my_point jako instancję Point3D, a następnie robimy to ...
wypisz my_point ... możemy zobaczyć to jako wynik ...
Niezbyt ładne, co?
Dlatego definiujemy specjalną metodę repr lub str lub obie, aby uzyskać lepszy wynik.
Wynik ...
(1, 2, 3) (1, 2, 3)
źródło
Zaimplementuj repr dla każdej implementowanej klasy. Nie powinno być wymówki. Zaimplementuj str dla klas, o których myślisz, że czytelność jest ważniejsza niż niejednoznaczność.
Skorzystaj z tego linku: https://www.pythoncentral.io/what-is-the-difference-between- str -and- repr -in-python /
źródło