2016-11-20 51 views
1

所以我有以下功能:如何將對象類附加到列表中?

def find_by_name(self, name): 
    fitting_list = [p for p in self.__persons if name.lower() in p.name.lower()] 
    return fitting_list 

而且我得到以下輸出時,我想打印的清單:

[<src.store.domain.person.Person object at 0x000001F88705B128>] 

爲什麼會出現這種情況,我該如何解決?

+0

你有什麼期望呢? –

+0

我希望打印與if條件相關的對象列表。我已經實現了__str__方法。這應該不夠嗎? – Binary

+0

就是這樣。它用一個Person對象打印一個列表。你會看到Python打印對象的默認方式。 –

回答

1

list不在乎你的班級有__str__方法。

當您打印對象時,print在對象上調用str以獲取合適的字符串。 str函數嘗試調用該對象的方法__str__,但如果它不具有一個一個,則它會調用該對象的__repr__方法。如果它們不是__repr__在該對象的類定義中的定義,那麼您將從父類中繼承該定義,通常這將是基類object類型的默認__repr__

list和其他內置樣tuplesetdict藏品沒有__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 

所以,如果你想成爲能夠打印對象的列表作爲一個單一的實體,有對象的字符串更加人性化,你有幾個選擇:

  1. 更改您的__str__方法__repr__的名稱。這是最簡單的方法,正如我之前所說的,如果在對象被傳遞給str時找不到__str__,將使用__repr__

  2. 離開現有的__str__方法,並創建一個更友好的__repr__。然而,建議__repr__向看到它的程序員顯示有用的信息,如果__repr__字符串可以複製&粘貼到解釋器或腳本中以重新創建對象,那麼實際上它很好。

  3. 單獨保留現有的__str__方法,並創建一個__repr__,調用__str__。雖然有效,但這有點愚蠢。相關策略是將__repr__設置爲引用__str__的類屬性。見下面的例子。

​​
+0

非常感謝。這使我明白__str__方法比我發現的任何其他教程都好。 – Binary

3

這只是對象的__repr____repr__旨在成爲對象的機器可讀表示,您可以通過過濾來更改它。

相關問題