Saya memiliki beberapa objek data di mana saya ingin mengimplementasikan fungsi to string dan equals yang mendalam.
Saya mengimplementasikan str dan eq dan meskipun equality bekerja dengan baik, saya tidak dapat membuat str berperilaku dengan cara yang sama:
class Bean(object):
def __init__(self, attr1, attr2):
self.attr1 = attr1
self.attr2 = attr2
def __str__(self):
return str(self.__dict__)
def __eq__(self, other):
return self.__dict__ == other.__dict__
Ketika saya menjalankan:
t1 = Bean("bean 1", [Bean("bean 1.1", "same"), Bean("bean 1.2", 42)])
t2 = Bean("bean 1", [Bean("bean 1.1", "same"), Bean("bean 1.2", 42)])
t3 = Bean("bean 1", [Bean("bean 1.1", "different"), Bean("bean 1.2", 42)])
print(t1)
print(t2)
print(t3)
print(t1 == t2)
print(t1 == t3)
Saya mendapatkan:
{'attr2': [<__main__.Bean object at 0x7fc092030f28>, <__main__.Bean object at 0x7fc092030f60>], 'attr1': 'bean 1'}
{'attr2': [<__main__.Bean object at 0x7fc091faa588>, <__main__.Bean object at 0x7fc092045128>], 'attr1': 'bean 1'}
{'attr2': [<__main__.Bean object at 0x7fc0920355c0>, <__main__.Bean object at 0x7fc092035668>], 'attr1': 'bean 1'}
True
False
karena t1 dan t2 berisi nilai yang sama, hasil yang sama akan kembali benar (seperti yang diharapkan) sementara karena t3 berisi nilai yang berbeda dalam daftar, hasilnya salah (juga seperti yang diharapkan). Apa yang saya inginkan adalah memiliki perilaku yang sama untuk string to (pada dasarnya juga masuk secara mendalam juga untuk elemen dalam daftar (atau set atau dict ...).
Untuk print(t1) saya ingin mendapatkan sesuatu seperti:
{'attr2': ["{'attr2': 'same', 'attr1': 'bean 1.1'}", "{'attr2': 42, 'attr1': 'bean 1.2'}"], 'attr1': 'bean 1'}
yang sebenarnya diperoleh jika saya melakukan:
Bean("bean 1", [Bean("bean 1.1", "same").__str__(), Bean("bean 1.2", 42).__str__()]).__str__
Karena saya tidak tahu jenis atribut attr1, attr2 di objek Bean saya (mereka mungkin daftar tetapi juga set, kamus dll.) akan menyenangkan untuk memiliki solusi sederhana dan elegan yang tidak memerlukan pemeriksaan jenis ...
Apakah ini mungkin?
Anda dapat menggunakan __repr__
sebagai ganti __str__
, yang bekerja secara rekursif, meskipun itu bukan ide yang baik sebagian besar waktu (lihat jawaban ini untuk lebih jelasnya). Namun demikian, ini bekerja untuk saya:
def __repr__(self):
return str(self.__dict__)
Anda bisa mencoba menggunakan repr sebagai ganti str.
Saya mendapatkan output di bawah ini untuk print(t1), ketika menggunakan def repr(self): bukan str.
{'attr1': 'bean 1', 'attr2': [{'attr1': 'bean 1.1', 'attr2': 'sama'}, {'attr1': 'bean 1.2', 'attr2': 42}]}
Beritahu saya jika ini memecahkan masalah Anda. Melampirkan gambar untuk referensi.
Salam, Vinith