list
不在乎你的班級有__str__
方法。
當您打印對象時,print
在對象上調用str
以獲取合適的字符串。 str
函數嘗試調用該對象的方法__str__
,但如果它不具有一個一個,則它會調用該對象的__repr__
方法。如果它們不是__repr__
在該對象的類定義中的定義,那麼您將從父類中繼承該定義,通常這將是基類object
類型的默認__repr__
。
list
和其他內置樣tuple
,set
和dict
藏品沒有__str__
方法,所以當你試圖將它們轉換爲字符串(顯式使用str
功能,或隱式的通過print
)他們__repr__
方法被調用。而這些方法又將repr
稱爲集合中的每個項目。因此,當您將這些集合對象中的任何一個傳遞給print
時,您將始終看到這些項目的__repr__
。並明確呼籲收集str
將沒有區別。
如果要查看list
或集合中項目的__str__
表示形式,您需要遍歷集合,在每個項目上明確調用str
。
這裏有一個很小的代碼片段(適用於Python 2 & 3),它說明了這些要點。
from __future__ import print_function
class Test(object):
def __str__(self):
return 'Test str'
def __repr__(self):
return 'Test repr'
a = [Test(), Test()]
print(id(a.__repr__), id(a.__str__))
print(a, str(a), repr(a))
for u in a:
print(u, str(u), repr(u))
輸出
3075508812 3075508812
[Test repr, Test repr] [Test repr, Test repr] [Test repr, Test repr]
Test str Test str Test repr
Test str Test str Test repr
所以,如果你想成爲能夠打印對象的列表作爲一個單一的實體,有對象的字符串更加人性化,你有幾個選擇:
更改您的__str__
方法__repr__
的名稱。這是最簡單的方法,正如我之前所說的,如果在對象被傳遞給str
時找不到__str__
,將使用__repr__
。
離開現有的__str__
方法,並創建一個更友好的__repr__
。然而,建議__repr__
向看到它的程序員顯示有用的信息,如果__repr__
字符串可以複製&粘貼到解釋器或腳本中以重新創建對象,那麼實際上它很好。
單獨保留現有的__str__
方法,並創建一個__repr__
,調用__str__
。雖然有效,但這有點愚蠢。相關策略是將__repr__
設置爲引用__str__
的類屬性。見下面的例子。
你有什麼期望呢? –
我希望打印與if條件相關的對象列表。我已經實現了__str__方法。這應該不夠嗎? – Binary
就是這樣。它用一個Person對象打印一個列表。你會看到Python打印對象的默認方式。 –