估计是我问题没有描述清楚,这样吧,直接上代码:
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中文网2017-04-17 17:45:30
你是用的是 "聚合" 的方式来建立自己的群集资料,这时候透过委托是个简单的方法:
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__
是Python 类中的特殊方法,他的回传值就是使用str(x)
所得到的值, 而print(x) code> 其实就等于是
print(str(x))
.其实再讲细一点,当我们呼叫 str(x)
的时候其实是呼叫 x.__str__()
. __str__
是 Python 類中的特殊方法,他的回傳值就是使用 str(x)
所得到的值, 而 print(x)
其實就等於是 print(str(x))
.其實再講細一點,當我們呼叫 str(x)
的時候其實是呼叫 x.__str__()
.
也就是說我們可以這樣想像:
print(x)
===print(str(x))
===print(x.__str__())
一般我們 自定義的類,__str__
方法的回傳值是默認的字串,比如說: <__main__.Mylist object at 0x0071A470>
用以說明 namespace, class name 和位置.如果要改變 __str__
的回傳值,我們必須要覆寫他.
這邊我們讓 __str__
的回傳值為 MyList
類中聚合的 list 的 __str__
值,這樣就透過委託的方式讓 __str__
的輸出跟 list 一樣了.
多嘴補充一下,這種在 class 裡面 以雙底線開頭且以雙底線結尾 的 method (俗名叫做魔術方法或是特殊方法),有個正式名稱叫做 "dunder method",對於 __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
下方評論問的問題我回答在這裡.
首先是不要被混淆,我們利用 print
印出來的內容都是 字串,即便你看到 [1, 2]
其實這也是一個字串 '[1, 2]'
,只不過內建的幾種資料型態(或我們有覆寫過 __str__
的 class) 會想辦法輸出一個帶有該資料型態特徵的字串(通常會非常接近我們產生這些資料時所用的"字面").
舉例,我們使用字面產生一個 list:
lst = [1, 2]
當我們打印 lst
時,Python 是會製造一個長得像該資料型態字面(甚至一模一樣)的字串讓你印出.
print(lst)
[1, 2] # 其實這是個字串,但是 lst 還是 list!
所以在這裡 str(list)
並沒有改變 list 中元素的 type,只不過將帶有其特徵的 "字串" 當成回傳值.
其次,如果想要在 Python shell (Python的互動介面)中能夠只利用變數名稱就展示用來表示 Mylist
的字串,光是 __str__
還不夠,這必須要覆寫 __repr__
一般我们🎜自定义的类🎜,print(x)
===print(str(x))
===print(x.__str__())
__str__
方法的回传值是默认的字串,比如说: <__main__.Mylist object at 0x0071A470>
用以说明namespace, class name 和位置.如果要改变 __str__
的回传值,我们必须要覆写他. 🎜
🎜这边我们让__str__
的回传值为MyList
类中聚合的list 的__str__
值,这样就透过委托的方式让< code>__str__ 的输出跟list 一样了. 🎜
__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🎜
print
印出来的内容都是🎜字串🎜,即便你看到[1, 2]
其实这也是一个字串'[1, 2]'
,只不过内建的几种资料型态(或我们有覆写过__str__
的class) 会想办法输出一个带有该资料型态特征的字串(通常会非常接近我们产生这些资料时所用的"字面"). 🎜
🎜举例,我们使用字面产生一个 list:🎜
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)
🎜当我们打印 lst
时,Python 是会制造一个长得像该资料型态字面(甚至一模一样)的字串让你印出. 🎜
\>>> from test import Mylist
\>>> lst = Mylist()
\>>> lst.add(1)
\>>> lst.add(2)
\>>> lst
[1, 2]
🎜所以在这里 str(list)
并没有改变 list 中元素的 type,只不过将带有其特征的 "字串" 当成回传值. 🎜
🎜其次,如果想要在Python shell (Python的互动介面)中能够只利用变数名称就展示用来表示Mylist
的字串,光是__str__
还不够,这必须要覆写__repr__
:🎜
rrreee
🎜🎜结果🎜:🎜
rrreee大家讲道理2017-04-17 17:45:30
在类中实现__str__函数,写入你想要输出的内容
例如
class Mylist(object):
def __str__(self):
return "This is my list"
mylist = Mylist()
print mylist
迷茫2017-04-17 17:45:30
print 函数会调用对象的__str__方法,如果你没有自己重新实现__str__方法的话,默认用的是继承自父类的__str__方法,这样不一定是按照list的方式输出了。
class MyList(list):
pass
print MyList() # []