Tujuan __repr__ Python

145
def __repr__(self):
  return '<%s %s (%s:%s) %s>' % (
    self.__class__.__name__, self.urlconf_name, self.app_name,
    self.namespace, self.regex.pattern)

Apa signifikansi / tujuan dari metode ini?

zjm1126
sumber
@ zjm1126: apakah Anda ingin tahu mengapa >>> variableprint what __repr__()return?
Esteban Küber
21
Dokumentasi itu membuat orang tertidur. Selain itu, mempelajari cara penggunaannya dari orang lain akan sangat membantu.
Concerned_Citizen
1
Kemungkinan duplikat Perbedaan antara __str__ dan __repr__ dengan Python
Vlad Bezden
2
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:

>>> 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)
lazy1
sumber
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.)
2
Referensi yang dihilangkan
S. Lott
1
Ini mungkin harus menggunakan% r daripada% s: stackoverflow.com/questions/6005159/…
Jonathan Adelson
47
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?
Charlie Parker
20

Ini dijelaskan dengan cukup baik dalam dokumentasi 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.

dmazzoni.dll
sumber
5
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.

>>> str(demo)
'<StackOverflow demo object __repr__>'

Selain itu, print()kelas akan memanggil __str__secara default.


Dokumentasi , jika Anda mau


sumber
8

The __repr__ metode hanya memberitahu Python cara untuk mencetak objek dari kelas

Jasper Kinoti
sumber
1

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()dan str()identik untuk int x, tetapi ada perbedaan antara nilai pengembalian untuk str 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.

Anh-Thi DINH
sumber
1

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)

Ashish Anand
sumber