python格式化输出类型_在python中自己写的数据类型使用print无法输出每个元素

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

1

2

3

4

5

6

7

8

9class 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方法用来添加其中的元素,添加完之后,我想输出其中的内容,然后我使用:

1

2

3

4list1=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”

你是用的是 “聚合” 的方式來建立自己的群集資料,這時候透過委託是個簡單的方法:

1

2

3

4

5

6

7

8

9

10

11

12class 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)

1__str__

是 Python 類中的特殊方法,他的回傳值就是使用

1str(x)

所得到的值, 而

1print(x)

其實就等於是

1print(str(x))

.其實再講細一點,當我們呼叫

1str(x)

的時候其實是呼叫

1x.__str__()

也就是說我們可以這樣想像:

1print(x)

===

1print(str(x))

===

1print(x.__str__())

一般我們 自定義的類,

1__str__

方法的回傳值是默認的字串,比如說:

1<__main__.Mylist object at 0x0071A470>

用以說明 namespace, class name 和位置.如果要改變

1__str__

的回傳值,我們必須要覆寫他.

這邊我們讓

1__str__

的回傳值為

1MyList

類中聚合的 list 的

1__str__

值,這樣就透過委託的方式讓

1__str__

的輸出跟 list 一樣了.

多嘴補充一下,這種在 class 裡面 以雙底線開頭且以雙底線結尾 的 method (俗名叫做魔術方法或是特殊方法),有個正式名稱叫做 “dunder method”,對於

1__str__

,我們可以唸作 “dunder string”.

The frequent use of a double underscores in internal identifiers in Python gave rise to the abbreviation dunder; this was coined by Mark Jacksonand independently by Tim Hochberg, within minutes of each other, both in reply to the same question in 2002. –wiki

下方評論問的問題我回答在這裡.

首先是不要被混淆,我們利用

1print

印出來的內容都是 字串,即便你看到

1[1, 2]

其實這也是一個字串

1'[1, 2]'

,只不過內建的幾種資料型態(或我們有覆寫過

1__str__

的 class) 會想辦法輸出一個帶有該資料型態特徵的字串(通常會非常接近我們產生這些資料時所用的”字面”).

舉例,我們使用字面產生一個 list:

1lst = [1, 2]

當我們打印

1lst

時,Python 是會製造一個長得像該資料型態字面(甚至一模一樣)的字串讓你印出.

1

2

3print(lst)

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

所以在這裡

1str(list)

並沒有改變 list 中元素的 type,只不過將帶有其特徵的 “字串” 當成回傳值.

其次,如果想要在 Python shell (Python的互動介面)中能夠只利用變數名稱就展示用來表示

1Mylist

的字串,光是

1__str__

還不夠,這必須要覆寫

1__repr__

:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16class 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)

結果:

1

2

3

4

5

6\>>> from test import Mylist

\>>> lst = Mylist()

\>>> lst.add(1)

\>>> lst.add(2)

\>>> lst

[1, 2]

1__str__

在类中实现__str__函数,写入你想要输出的内容

例如

1

2

3

4

5

6class Mylist(object):

def __str__(self):

return "This is my list"

mylist = Mylist()

print mylist

print 函数会调用对象的__str__方法,如果你没有自己重新实现__str__方法的话,默认用的是继承自父类的__str__方法,这样不一定是按照list的方式输出了。

1

2

3

4class MyList(list):

pass

print MyList() # []

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值