Pertimbangkan kelas ini:
class foo(object):
pass
Representasi string default terlihat seperti ini:
>>> str(foo)
"<class '__main__.foo'>"
Bagaimana saya bisa menjadikan tampilan ini sebagai string khusus?
Menerapkan __str__()
atau __repr__()
dalam metaclass kelas.
class MC(type):
def __repr__(self):
return 'Wahaha!'
class C(object):
__metaclass__ = MC
print C
Gunakan __str__
jika Anda bermaksud pengerasan yang dapat dibaca, gunakan __repr__
untuk representasi yang tidak ambigu.
_representation
ke tubuh kelas danreturn self._representation
dalam__repr__()
metode metaclass.__repr__
untuk mewakiliC
. Alternatif untuk memiliki_representation
anggota adalah dengan membuat pabrik metaclass yang menghasilkan metaclass dengan tepat__repr__
(ini bisa menyenangkan jika Anda sering menggunakan ini).sumber
instances
kelas, bukan untuk kelas itu sendiri.Jika Anda harus memilih di antara
__repr__
atau__str__
pergi untuk yang pertama, sebagai__str__
panggilan implementasi standar__repr__
ketika itu tidak ditentukan.Contoh Vector3 Kustom:
Dalam contoh ini,
repr
mengembalikan lagi string yang dapat langsung dikonsumsi / dieksekusi, sedangkanstr
yang lebih berguna sebagai hasil debug.sumber
__repr__
vs__str__
benar, ini tidak menjawab pertanyaan aktual, yaitu tentang objek kelas, bukan instance.Jawaban yang disetujui Ignacio Vazquez-Abrams cukup tepat. Namun, dari generasi Python 2. Pembaruan untuk Python 3 saat ini adalah:
Jika Anda menginginkan kode yang berjalan melintasi Python 2 dan Python 3, keenam modul tersebut telah Anda bahas:
Akhirnya, jika Anda memiliki satu kelas yang Anda ingin memiliki repr statis kustom, pendekatan berbasis kelas di atas berfungsi dengan baik. Tetapi jika Anda memiliki beberapa, Anda harus membuat metaclass yang mirip dengan
MC
masing-masing, dan itu bisa melelahkan. Dalam hal itu, mengambil metaprogramming Anda satu langkah lebih jauh dan membuat pabrik metaclass membuat segalanya sedikit lebih bersih:cetakan:
Metaprogramming bukanlah sesuatu yang biasanya Anda butuhkan setiap hari — tetapi ketika Anda membutuhkannya, itu benar-benar tepat sasaran!
sumber
Hanya menambahkan ke semua jawaban yang bagus, versi saya dengan dekorasi:
stdout:
Sisi bawah:
C
tanpa kelas super (tidakclass C:
)C
contoh akan menjadi contoh dari beberapa derivasi aneh, jadi mungkin ide yang bagus untuk menambahkan__repr__
contoh juga.sumber