W Javie, jeśli wywołam List.toString (), automatycznie wywoła metodę toString () dla każdego obiektu wewnątrz Listy. Na przykład, jeśli moja lista zawiera obiekty o1, o2 i o3, list.toString () wyglądałaby mniej więcej tak:
"[" + o1.toString() + ", " + o2.toString() + ", " + o3.toString() + "]"
Czy istnieje sposób na uzyskanie podobnego zachowania w Pythonie? Zaimplementowałem metodę __str __ () w mojej klasie, ale kiedy wydrukuję listę obiektów, używając:
print 'my list is %s'%(list)
wygląda mniej więcej tak:
[<__main__.cell instance at 0x2a955e95f0>, <__main__.cell instance at 0x2a955e9638>, <__main__.cell instance at 0x2a955e9680>]
jak mogę zmusić Pythona do automatycznego wywoływania mojego __str__ dla każdego elementu na liście (lub dyktowania w tym przypadku)?
Odpowiedzi:
Wywołanie łańcucha znaków na liście w języku Python wywołuje
__repr__
metodę na każdym elemencie wewnątrz. W przypadku niektórych pozycji__str__
i__repr__
są takie same. Jeśli chcesz takiego zachowania, zrób:źródło
__str__
z__repr__
zwykle nie zgadza się z modelem danych Pythona , więc rozwiązanie do rozumienia list zaproponowane przez @ daniel-lew jest bardziej pythonowe.str()
na liście wróciłostr()
dla każdego z poszczególnych elementów wewnątrz.Możesz użyć funkcji rozumienia list, aby automatycznie wygenerować nową listę z każdym elementem str () 'd:
źródło
print(map(str, mylist))
- jest trochę krótszyDwie proste rzeczy, które możesz zrobić, użyj
map
funkcji lub użyj zrozumienia.Ale to daje ci listę ciągów, a nie ciąg. Musisz więc połączyć ze sobą struny.
lub
Następnie możesz wydrukować ten złożony obiekt typu string.
źródło
W zależności od tego, do czego chcesz użyć tego wyniku, może
__repr__
być bardziej odpowiednie:źródło
Zgadzam się z poprzednią odpowiedzią dotyczącą używania w tym celu wyrażeń listowych, ale z pewnością można by to ukryć za funkcją, jeśli to właśnie ona unosi łódź.
Dla zabawy utworzyłem list_str () rekurencyjnie str () wszystko zawarte na liście.
źródło
__str__
i__repr__
osobnoCoś takiego?
źródło
To powinno wystarczyć.
Podczas drukowania list, a także innych klas kontenerów, zawarte w nich elementy zostaną wydrukowane przy użyciu
__repr__
, ponieważ__repr__
mają być używane do wewnętrznej reprezentacji obiektu. Jeśli zadzwonimy:help(object.__repr__)
powie nam:A jeśli zadzwonimy
help(repr)
, wyświetli:Jeśli
__str__
jest zaimplementowane dla obiektu i__repr__
nie jestrepr(obj)
, wyprowadza domyślne wyjście, tak jakprint(obj)
wtedy, gdy żadne z nich nie jest zaimplementowane.Więc jedynym sposobem jest wdrożenie
__repr__
dla swojej klasy. Można to zrobić w następujący sposób:źródło
Dane wyjściowe, które otrzymujesz, to tylko nazwa modułu obiektu, nazwa klasy, a następnie adres pamięci w formacie szesnastkowym, ponieważ
__repr__
funkcja nie jest nadpisywana.__str__
służy do reprezentacji obiektu w postaci ciągu znaków podczas korzystania z funkcji print. Ale ponieważ drukujesz listę obiektów, a nie iterujesz po liście w celu wywołaniastr
metody dla każdego elementu, wypisuje reprezentację obiektów.Aby wywołać
__str__
funkcję, musisz zrobić coś takiego:Jeśli nadpisujesz
__repr__
funkcję, możesz użyć metody drukowania, tak jak poprzednio:Otrzymasz wtedy „
my list is [1, 2, 3]
” jako wyjście.źródło