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?
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?
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)
__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).
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.
stackoverflowtetapi repr ('stackoverflow') adalah 'stackoverflow'.
__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
The __repr__ metode hanya memberitahu Python cara untuk mencetak objek dari kelas
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.
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)
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 /
>>> variableprint what__repr__()return?