在python中自己写的数据类型使用print无法输出每个元素
PHP中文网
PHP中文网 2017-04-17 17:43:30
0
4
1385

估计是我问题没有描述清楚,这样吧,直接上代码:

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”

PHP中文网
PHP中文网

认证0级讲师

membalas semua(4)
洪涛

Anda menggunakan kaedah "agregasi" untuk mencipta data kluster anda sendiri Pada masa ini, perwakilan ialah kaedah mudah:

class Mylist:
    def __init__(self):
        self._mylist=list()

    def __len__(self):
        return len(self._mylist)

    def add(self,value):
        return self._mylist.append(value)

    def __str__(self):
        return str(self._mylist)

__str__ ialah kaedah khas dalam kelas Python Nilai pulangannya ialah nilai yang diperoleh dengan menggunakan str(x), dan print(x) sebenarnya sama dengan print(str(x)). Malah, untuk lebih terperinci, apabila kita memanggil str(x), kita sebenarnya memanggil x.__str__().

Dalam erti kata lain, kita boleh bayangkan seperti ini:

print(x) === print(str(x)) === print(x.__str__())

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 nilai MyList 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".

Penggunaan garis bawah berganda yang kerap dalam pengecam dalaman dalam Python menimbulkan singkatan dunder ini dicipta oleh Mark Jackson dan secara bebas oleh Tim Hochberg, dalam beberapa minit antara satu sama lain, kedua-duanya sebagai jawapan kepada soalan yang sama dalam 2002. --wiki


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:

lst = [1, 2]

Apabila kami mencetak lst, Python akan mencipta rentetan yang kelihatan seperti jenis data literal (atau malah betul-betul sama) untuk anda cetak.

print(lst)

[1, 2] # 其實這是個字串,但是 lst 還是 list!

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__:

class Mylist:

    def __init__(self):
        self._mylist=list()

    def __len__(self):
        return len(self._mylist)

    def add(self,value):
        return self._mylist.append(value)

    def __str__(self):
        return str(self._mylist)
        
    def __repr__(self):
        return str(self)

Keputusan:

\>>> from test import Mylist
\>>> lst = Mylist()
\>>> lst.add(1)
\>>> lst.add(2)
\>>> lst
[1, 2]
洪涛
__str__
大家讲道理

Laksanakan fungsi __str__ dalam kelas dan tulis kandungan yang anda ingin keluarkan
Contohnya

class Mylist(object):
    def __str__(self):
        return "This is my list"
 
mylist = Mylist()
print mylist
迷茫

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.

class MyList(list):
    pass
    
print MyList()    # []
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan