Di Java, jika saya memanggil List.toString (), maka secara otomatis akan memanggil metode toString () pada setiap objek di dalam List. Misalnya, jika daftar saya berisi objek o1, o2, dan o3, list.toString () akan terlihat seperti ini:
"[" + o1.toString() + ", " + o2.toString() + ", " + o3.toString() + "]"
Apakah ada cara untuk mendapatkan perilaku serupa dengan Python? Saya menerapkan metode __str __ () di kelas saya, tetapi ketika saya mencetak daftar objek, menggunakan:
print 'my list is %s'%(list)
itu terlihat seperti ini:
[<__main__.cell instance at 0x2a955e95f0>, <__main__.cell instance at 0x2a955e9638>, <__main__.cell instance at 0x2a955e9680>]
bagaimana saya bisa mendapatkan python untuk memanggil __str__ saya secara otomatis untuk setiap elemen di dalam daftar (atau dict dalam hal ini)?
Jawaban:
Memanggil string pada daftar python memanggil
__repr__
metode pada setiap elemen di dalamnya. Untuk beberapa item,__str__
dan__repr__
sama. Jika Anda menginginkan perilaku itu, lakukan:sumber
__str__
dengan__repr__
biasanya tidak sesuai dengan model data Python , sehingga solusi pemahaman daftar yang diusulkan oleh @ daniel-lew lebih bersifat pythonic.str()
pada daftar dikembalikanstr()
untuk setiap elemen individu di dalamnya.Anda dapat menggunakan pemahaman daftar untuk menghasilkan daftar baru dengan setiap item str () 'd secara otomatis:
sumber
print(map(str, mylist))
- ini sedikit lebih pendekDua hal mudah yang bisa Anda lakukan, gunakan
map
fungsi atau gunakan pemahaman.Tapi itu memberi Anda daftar string, bukan string. Jadi, Anda juga harus menggabungkan senar.
atau
Kemudian Anda dapat mencetak objek string komposit ini.
sumber
Bergantung pada apa Anda ingin menggunakan output itu, mungkin
__repr__
lebih tepat:sumber
Saya setuju dengan jawaban sebelumnya tentang menggunakan pemahaman daftar untuk melakukan ini, tetapi Anda pasti bisa menyembunyikannya di balik suatu fungsi, jika itu yang mengapung perahu Anda.
Hanya untuk bersenang-senang, saya membuat list_str () secara rekursif str () semua yang ada dalam daftar.
sumber
__str__
dan__repr__
secara terpisahSesuatu seperti ini?
sumber
Ini sudah cukup.
Saat mencetak daftar serta kelas wadah lainnya, elemen yang terkandung akan dicetak menggunakan
__repr__
, karena__repr__
dimaksudkan untuk digunakan untuk representasi objek internal. Jika kita menelepon:help(object.__repr__)
itu akan memberi tahu kita:Dan jika kita menyebutnya
help(repr)
akan menghasilkan:Jika
__str__
diimplementasikan untuk sebuah objek dan__repr__
tidakrepr(obj)
akan menampilkan keluaran default, sepertiprint(obj)
saat yang bukan ini diimplementasikan.Jadi satu-satunya cara adalah menerapkannya
__repr__
untuk kelas Anda. Salah satu cara yang mungkin untuk melakukannya adalah ini:sumber
Output yang Anda dapatkan hanyalah nama modul objek, nama kelas, dan kemudian alamat memori dalam heksadesimal karena
__repr__
fungsinya tidak diganti.__str__
digunakan untuk representasi string suatu objek saat menggunakan print. Tapi karena Anda mencetak daftar objek, dan tidak mengulang daftar untuk memanggilstr
metode untuk setiap item, itu mencetak representasi objek.Agar
__str__
fungsi tersebut dipanggil, Anda perlu melakukan sesuatu seperti ini:Jika Anda mengesampingkan
__repr__
fungsi, Anda dapat menggunakan metode cetak seperti sebelumnya:Kemudian Anda akan mendapatkan "
my list is [1, 2, 3]
" sebagai keluaran Anda.sumber