2012-10-17 47 views
29

所以我有一個類,名爲Vertex打印用戶定義類的對象列表

class Vertex: 
    ''' 
    This class is the vertex class. It represents a vertex. 
    ''' 

    def __init__(self, label): 
     self.label = label 
     self.neighbours = [] 

    def __str__(self): 
     return("Vertex "+str(self.label)+":"+str(self.neighbours)) 

我想打印這個類的對象的列表,像這樣:

x = [Vertex(1), Vertex(2)] 
print x 

,但它讓我看到這樣的輸出:

[<__main__.Vertex instance at 0xb76ed84c>, <__main__.Vertex instance at 0xb76ed86c>] 

其實,我想打印每個對象的值爲Vertex.label。 有什麼辦法可以做到嗎?

回答

39

如果你只想打印每個對象的標籤,你可以使用一個循環或列表理解:

print [vertex.label for vertex in x] 

但是,爲了回答你原來的問題,你需要定義__repr__方法來獲取列表輸出權限。這可能是因爲這簡單的東西:

def __repr__(self): 
    return str(self) 
6

如果你想除了丹尼爾·羅斯曼答案多一點的相關信息:

__repr____str__都是用Python兩回事。 (注意,但是,如果你只__repr__定義,以class.__str__通話將轉化爲一個呼叫class.__repr__

__repr__的目標是成爲明確的。另外,whenerver可能的話,你應該定義再版,這樣(你的情況)eval(repr(instance)) == instance

在另一方面,__str__的目標是成爲redeable;所以如果你不得不在屏幕上打印實例(對於用戶來說可能),如果你不需要這樣做,那麼不要實現它(如果str未實現的話將被稱爲repr),這一點很重要。

另外,在Idle解釋器中輸入內容時,它會自動調用對象的repr表示形式。或者當您打印一份清單時,它會呼叫list.__str__(與list.__repr__相同),輪流調用列表中包含的任何元素的repr表示。這解釋了你得到的行爲,並希望如何解決它

+0

我明白了,所以解釋器遞歸調用__repr __()列表中的任何對象..是嗎? – czardoz

+0

不,解釋器正在調用list .__ str __()(或repr,它依賴,但是這是同樣的事情)和list .__ str__返回一個字符串,它通過調用列表包含的所有對象的repr來組成 – Ant