Uczę się lin w Pythonie. Kiedy próbuję wydrukować obiekt klasy Foobar
za pomocą print()
funkcji, otrzymuję dane wyjściowe takie jak to:
<__main__.Foobar instance at 0x7ff2a18c>
Czy istnieje sposób, aby ustawić zachowanie drukowania (lub reprezentację ciągu ) klasy i jej obiektów ? Na przykład, gdy print()
wywołuję obiekt klasy, chciałbym wydrukować jego elementy danych w określonym formacie. Jak to osiągnąć w Pythonie?
Jeśli znasz klasy C ++, powyższe można osiągnąć dla standardu ostream
, dodając friend ostream& operator << (ostream&, const Foobar&)
metodę dla klasy.
Jak wspomniał Chris Lutz , jest to zdefiniowane przez
__repr__
metodę w twojej klasie.Z dokumentacji
repr()
:Biorąc pod uwagę następującą klasę testu:
.. będzie działał w następujący sposób w powłoce Pythona:
Jeśli nie
__str__
zdefiniowano żadnej metody,print(t)
(lubprint(str(t))
) użyje wyniku__repr__
zamiastJeśli nie
__repr__
zdefiniowano żadnej metody, używana jest wartość domyślna, co jest prawie równoważne z ...źródło
__str__
różni się od wyników interaktywnej powłoki, które dajesz. : P%
Formatowania ciągiem jest wycofywane z docs.python.org/whatsnew/2.6.html „operator% jest uzupełniony przez mocniejszy metodę wzoru (formatowania ciągu)”%
było bardzo wygodne.Ogólny sposób, który można zastosować do dowolnej klasy bez określonego formatowania, można wykonać w następujący sposób:
I wtedy,
produkuje
źródło
Jeśli jesteś w sytuacji takiej jak @Keith, możesz spróbować:
Jest to sprzeczne z tym, co uważam za dobry styl, ale jeśli próbujesz po prostu debugować, powinno zrobić to, co chcesz.
źródło
Aby dodać moje dwa centy do odpowiedzi @ dbr, poniżej znajduje się przykład implementacji tego zdania z oficjalnej dokumentacji, którą zacytował:
Biorąc pod uwagę tę definicję klasy:
Teraz łatwo jest serializować wystąpienie
Test
klasy:Tak więc, uruchamiając ostatni fragment kodu, otrzymamy:
Ale, jak powiedziałem w moim ostatnim komentarzu: więcej informacji jest tutaj !
źródło
Musisz użyć
__repr__
. Jest to standardowa funkcja jak__init__
. Na przykład:źródło
Ładniejsza wersja odpowiedzi @ user394430
Tworzy ładną wizualnie listę nazw i wartości.
Jeszcze bardziej wyrafinowana wersja (dzięki Ruud) sortuje przedmioty:
źródło
W przypadku Python 3:
Jeśli określony format nie jest ważny (np. Do debugowania), po prostu odziedzicz z klasy Printable poniżej. Nie trzeba pisać kodu dla każdego obiektu.
Zainspirowany tą odpowiedzią
źródło
W tym wątku jest już wiele odpowiedzi, ale żadna z nich szczególnie mi nie pomogła, sam musiałem to wypracować, więc mam nadzieję, że ta jest nieco bardziej pouczająca.
Musisz tylko upewnić się, że na końcu zajęć masz nawiasy, np .:
Oto przykład kodu z projektu, nad którym pracowałem:
Aby wydrukować moją klasę wodoru, użyłem:
Pamiętaj, że nie zadziała to bez nawiasów na końcu wodoru. Są konieczne.
Mam nadzieję, że to pomoże, daj mi znać, jeśli masz więcej pytań.
źródło