Untuk pengembang Java yang mempelajari Python, cara terbaik untuk melihatnya adalah sebagai toString () di Java.
Ravi
apakah setiap kelas menerapkan repr dengan python?
Charlie Parker
Jawaban:
195
__repr__harus mengembalikan representasi yang dapat dicetak dari objek, kemungkinan besar salah satu cara yang memungkinkan untuk membuat objek ini. Lihat dokumentasi resmi di sini . __repr__lebih untuk pengembang sedangkan __str__untuk pengguna akhir.
Contoh sederhana:
>>> 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: Saya terutama ingin memperbaiki pemformatan (berguna untuk memiliki contoh yang cocok sedekat mungkin dengan apa yang akan mereka lihat dalam sesi sampel), tetapi saya juga mengubah format keluaran agar secara eksplisit berbeda dari tugas, karena itu sangat meningkatkan kejelasan untuk seseorang yang bingung tentang ini, imho. (Jika saya sudah pergi jauh, edit ulang saja, dan saya akan berhutang budi kepada Anda.)
Ini tidak benar. __str__adalah output yang seharusnya dapat dibaca manusia: __repr__seharusnya merupakan representasi yang dapat dibaca oleh interpreter Python (yaitu memberi makan string ke interpreter harus membuat ulang objek). Jika sebuah objek tidak memiliki __str__metode, bagaimanapun, __repr__digunakan sebagai gantinya. Juga seperti yang dicatat: contoh ini sebenarnya mencetak __str__metode self.xdan self.y: %rharus digunakan sebagai pengganti %sdalam operasi pemformatan string (karena kelas tidak mendefinisikan __str__, __repr__sebenarnya dikembalikan, tetapi ini adalah anomali).
Daniel Andersson
apakah setiap kelas menerapkan repr dengan python?
repr ( object ): Mengembalikan string yang berisi representasi yang dapat dicetak dari suatu objek. Ini adalah nilai yang sama yang dihasilkan oleh konversi (kutipan terbalik). Terkadang berguna untuk dapat mengakses operasi ini sebagai fungsi biasa. Untuk banyak tipe, fungsi ini berusaha mengembalikan string yang akan menghasilkan objek dengan nilai yang sama ketika diteruskan ke eval(), jika tidak representasi adalah string yang diapit dalam tanda kurung sudut yang berisi nama tipe objek bersama dengan informasi tambahan sering kali mencantumkan nama dan alamat objek. Sebuah kelas dapat mengontrol apa yang dikembalikan fungsi ini untuk instance-nya dengan mendefinisikan __repr__()metode.
Jadi apa yang Anda lihat di sini adalah implementasi default __repr__, yang berguna untuk serialisasi dan debugging.
Saya pikir metode kutipan terbalik (atau 'backticks') untuk mendapatkan "representasi" dari suatu objek sudah tidak digunakan lagi, dan telah dihapus untuk versi 3.0
MatrixFrog
MatrixFrog: keduanya benar, tetapi dokumentasi 2.x saat ini masih mengatakan ini, dari mana kutipan tersebut berasal.
Untuk banyak objek, __repr__ dan __str__ adalah fungsi yang sama. Faktanya, jika Anda hanya mendefinisikan __str__, maka __repr__ secara default hanya memanggil __str__. Kasus paling jelas di mana ini tidak benar adalah string itu sendiri: str ('stackoverflow') mengembalikan stackoverflowtetapi repr ('stackoverflow') adalah 'stackoverflow'.
MatrixFrog
6
Anda memiliki kebalikannya, __repr__ tidak pernah menggunakan __str__, tetapi kebalikannya mungkin terjadi. Lihat docs.python.org/reference/…
apakah setiap kelas menerapkan repr dengan python?
Charlie Parker
14
__repr__digunakan oleh penerjemah Python mandiri untuk menampilkan kelas dalam format yang dapat dicetak. Contoh:
~> 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__>
Dalam kasus di mana __str__metode tidak didefinisikan di kelas, itu akan memanggil __repr__fungsi dalam upaya untuk membuat representasi yang dapat dicetak.
Kembalian dari repr()dan str()identik untuk int x, tetapi ada perbedaan antara nilai pengembalian untuk stry- yang satu formal dan yang lainnya informal . Salah satu perbedaan terpenting antara representasi formal dan informal adalah bahwa implementasi default __repr__untuk nilai str dapat disebut sebagai argumen untuk eval, dan nilai yang dikembalikan akan menjadi objek string yang valid, seperti ini:
Saat kita membuat tipe baru dengan mendefinisikan kelas, kita dapat memanfaatkan fitur tertentu dari Python untuk membuat kelas baru nyaman digunakan. Salah satu fitur ini adalah "metode khusus", juga disebut sebagai "metode ajaib".
Metode khusus memiliki nama yang dimulai dan diakhiri dengan dua garis bawah. Kami mendefinisikannya, tetapi biasanya tidak memanggil mereka secara langsung dengan namanya. Sebaliknya, mereka mengeksekusi secara otomatis dalam keadaan tertentu.
Lebih mudah untuk dapat menghasilkan nilai instance dari suatu objek dengan menggunakan pernyataan cetak. Saat kami melakukan ini, kami ingin nilai direpresentasikan dalam output dalam beberapa format yang tidak ambigu. The cetak ulang metode khusus dapat digunakan untuk mengatur hal ini terjadi. Jika kita mendefinisikan metode ini, itu bisa dipanggil secara otomatis ketika kita mencetak nilai dari sebuah instance dari kelas yang kita definisikan metode ini. Namun, harus disebutkan bahwa ada juga metode khusus str , digunakan untuk tujuan yang serupa, tetapi tidak identik, yang mungkin diutamakan, jika kita juga telah mendefinisikannya.
Jika kami belum menentukan, metode repr untuk kelas Point3D, dan telah membuat my_point sebagai turunan dari Point3D, dan kemudian kami melakukan ini ...
print my_point ... kita mungkin melihat ini sebagai output ...
Tidak terlalu bagus, ya?
Jadi, kami mendefinisikan metode khusus repr atau str , atau keduanya, untuk mendapatkan hasil yang lebih baik.
**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**
Implementasikan repr untuk setiap kelas yang Anda terapkan. Seharusnya tidak ada alasan. Menerapkan str untuk kelas yang menurut Anda keterbacaan lebih penting dari non-ambiguitas.
>>> variable
print what__repr__()
return?Jawaban:
__repr__
harus mengembalikan representasi yang dapat dicetak dari objek, kemungkinan besar salah satu cara yang memungkinkan untuk membuat objek ini. Lihat dokumentasi resmi di sini .__repr__
lebih untuk pengembang sedangkan__str__
untuk pengguna akhir.Contoh sederhana:
>>> class Point: ... 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)
sumber
__str__
adalah output yang seharusnya dapat dibaca manusia:__repr__
seharusnya merupakan representasi yang dapat dibaca oleh interpreter Python (yaitu memberi makan string ke interpreter harus membuat ulang objek). Jika sebuah objek tidak memiliki__str__
metode, bagaimanapun,__repr__
digunakan sebagai gantinya. Juga seperti yang dicatat: contoh ini sebenarnya mencetak__str__
metodeself.x
danself.y
:%r
harus digunakan sebagai pengganti%s
dalam operasi pemformatan string (karena kelas tidak mendefinisikan__str__
,__repr__
sebenarnya dikembalikan, tetapi ini adalah anomali).Ini dijelaskan dengan cukup baik dalam dokumentasi Python :
Jadi apa yang Anda lihat di sini adalah implementasi default
__repr__
, yang berguna untuk serialisasi dan debugging.sumber
stackoverflow
tetapi repr ('stackoverflow') adalah'stackoverflow'
.__repr__
digunakan oleh penerjemah Python mandiri untuk menampilkan kelas dalam format yang dapat dicetak. Contoh:Dalam kasus di mana
__str__
metode tidak didefinisikan di kelas, itu akan memanggil__repr__
fungsi dalam upaya untuk membuat representasi yang dapat dicetak.Selain itu,
print()
kelas akan memanggil__str__
secara default.Dokumentasi , jika Anda mau
sumber
The __repr__ metode hanya memberitahu Python cara untuk mencetak objek dari kelas
sumber
Contoh untuk melihat perbedaan di antara mereka (saya salin dari sumber ini ),
>>> x=4 >>> repr(x) '4' >>> str(x) '4' >>> y='stringy' >>> repr(y) "'stringy'" >>> str(y) 'stringy'
Kembalian dari
repr()
danstr()
identik untukint x
, tetapi ada perbedaan antara nilai pengembalian untukstr
y
- yang satu formal dan yang lainnya informal . Salah satu perbedaan terpenting antara representasi formal dan informal adalah bahwa implementasi default__repr__
untuk nilai str dapat disebut sebagai argumen untuk eval, dan nilai yang dikembalikan akan menjadi objek string yang valid, seperti ini:>>> repr(y) "'a string'" >>> y2=eval(repr(y)) >>> y==y2 True
Jika Anda mencoba memanggil nilai kembalian dari
__str__
sebagai argumen ke eval, hasilnya tidak akan valid.sumber
Saat kita membuat tipe baru dengan mendefinisikan kelas, kita dapat memanfaatkan fitur tertentu dari Python untuk membuat kelas baru nyaman digunakan. Salah satu fitur ini adalah "metode khusus", juga disebut sebagai "metode ajaib".
Metode khusus memiliki nama yang dimulai dan diakhiri dengan dua garis bawah. Kami mendefinisikannya, tetapi biasanya tidak memanggil mereka secara langsung dengan namanya. Sebaliknya, mereka mengeksekusi secara otomatis dalam keadaan tertentu.
Lebih mudah untuk dapat menghasilkan nilai instance dari suatu objek dengan menggunakan pernyataan cetak. Saat kami melakukan ini, kami ingin nilai direpresentasikan dalam output dalam beberapa format yang tidak ambigu. The cetak ulang metode khusus dapat digunakan untuk mengatur hal ini terjadi. Jika kita mendefinisikan metode ini, itu bisa dipanggil secara otomatis ketika kita mencetak nilai dari sebuah instance dari kelas yang kita definisikan metode ini. Namun, harus disebutkan bahwa ada juga metode khusus str , digunakan untuk tujuan yang serupa, tetapi tidak identik, yang mungkin diutamakan, jika kita juga telah mendefinisikannya.
Jika kami belum menentukan, metode repr untuk kelas Point3D, dan telah membuat my_point sebagai turunan dari Point3D, dan kemudian kami melakukan ini ...
print my_point ... kita mungkin melihat ini sebagai output ...
Tidak terlalu bagus, ya?
Jadi, kami mendefinisikan metode khusus repr atau str , atau keduanya, untuk mendapatkan hasil yang lebih baik.
**class Point3D(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 automatically print my_point # __str__ gets called automatically**
Keluaran ...
(1, 2, 3) (1, 2, 3)
sumber
Implementasikan repr untuk setiap kelas yang Anda terapkan. Seharusnya tidak ada alasan. Menerapkan str untuk kelas yang menurut Anda keterbacaan lebih penting dari non-ambiguitas.
Merujuk link ini: https://www.pythoncentral.io/what-is-the-difference-between- str -dan- cetak ulang -in-python /
sumber