估计是我问题没有描述清楚,这样吧,直接上代码:
class Mylist:
def __init__(self):
self._mylist=list()
def __len__(self):
return len(self._mylist)
def add(self,value):
return self._mylist.append(value)
我自己模仿list的行为。写了一个基本的list,名字叫Mylist,并给他一个add方法用来添加其中的元素,添加完之后,我想输出其中的内容,然后我使用:
list1=Mylist()
list1.add(1)
list1.add(2)
print(list1)
我以为print会显示出list1中的每一项,但是发现实际没有,显示的为:
<__main__.Mylist object at 0x0071A470>
怎么样能让print(list1)显示出的结果和真实list类型一样呢?例如:
[1,2]
__str__具体怎么实现,貌似这个只能为str类型,int不行,而且我发现在pycharm 里面写的时候,提示__str__方法“overrides method in object”
Anda menggunakan kaedah "agregasi" untuk mencipta data kluster anda sendiri Pada masa ini, perwakilan ialah kaedah mudah:
__str__
ialah kaedah khas dalam kelas Python Nilai pulangannya ialah nilai yang diperoleh dengan menggunakanstr(x)
, danprint(x)
sebenarnya sama denganprint(str(x))
. Malah, untuk lebih terperinci, apabila kita memanggilstr(x)
, kita sebenarnya memanggilx.__str__()
.Dalam erti kata lain, kita boleh bayangkan seperti ini:
Secara amnya, untuk kelas tersuai kami, nilai pulangan kaedah
__str__
ialah rentetan lalai, contohnya:<__main__.Mylist object at 0x0071A470>
digunakan untuk menerangkan ruang nama, nama kelas dan lokasi. Jika kita ingin menukar nilai pulangan__str__
, kita mesti menimpanya.Di sini kita biarkan nilai pulangan
__str__
menjadi nilaiMyList
senarai yang diagregatkan dalam kelas__str__
, supaya output__str__
adalah sama dengan senarai melalui perwakilan.Saya ingin menambah bahawa kaedah jenis ini (biasanya dikenali sebagai kaedah ajaib atau kaedah khas) yang bermula dengan garis bawah berganda dan berakhir dengan garis bawah berganda dalam kelas mempunyai nama rasmi yang dipanggil kaedah "dunder"", untuk
__str__
, kita boleh menyebutnya sebagai "rentetan dunder".Saya akan menjawab soalan yang ditanya dalam komen di bawah.
Pertama sekali, jangan keliru Kandungan bercetak yang kami gunakan
print
semuanya rentetan Walaupun anda melihat[1, 2]
, ia sebenarnya rentetan'[1, 2]'
, tetapi ia terbina dalam Beberapa jenis data (atau kelas yang telah kami gantikan__str__
) akan mencari jalan untuk mengeluarkan rentetan dengan ciri-ciri jenis data (biasanya sangat hampir dengan "harfiah" yang kami gunakan semasa menjana data ini) .Sebagai contoh, kami menggunakan literal untuk menjana senarai:
Apabila kami mencetak
lst
, Python akan mencipta rentetan yang kelihatan seperti jenis data literal (atau malah betul-betul sama) untuk anda cetak.Jadi di sini
str(list)
tidak mengubah jenis elemen dalam senarai, tetapi hanya menggunakan "rentetan" dengan ciri-cirinya sebagai nilai pulangan.Kedua, jika anda ingin memaparkan rentetan yang mewakili
Mylist
hanya menggunakan nama pembolehubah dalam shell Python (antara muka interaktif Python),__str__
sahaja tidak mencukupi, anda mesti mengatasi__repr__
:Keputusan:
Laksanakan fungsi __str__ dalam kelas dan tulis kandungan yang anda ingin keluarkan
Contohnya
Fungsi cetakan akan memanggil kaedah __str__ objek Jika anda belum melaksanakan semula kaedah __str__ sendiri, kaedah __str__ yang diwarisi daripada kelas induk akan digunakan secara lalai, jadi output tidak semestinya dalam bentuk. daripada senarai.