打印用户定义的类的对象列表

时间:2012-10-17 12:07:10

标签: python

所以我有一个名为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的值。 有没有办法做到这一点?

3 个答案:

答案 0 :(得分:56)

如果您只想打印每个对象的标签,可以使用循环或列表理解:

print [vertex.label for vertex in x]

但要回答原始问题,您需要定义__repr__方法以使列表输出正确。它可能就像这样简单:

def __repr__(self):
    return str(self)

答案 1 :(得分:9)

除了丹尼尔罗斯曼之外,如果你想要更多的信息回答:

__repr____str__是python中的两个不同的东西。 (请注意,如果您仅定义了__repr__,则对class.__str__的调用将转化为对class.__repr__的调用

__repr__的目标是明确的。另外,在可能的情况下,您应该定义repr以便(在您的情况下)eval(repr(instance)) == instance

另一方面,__str__的目标是可以恢复的;所以如果你不得不在屏幕上打印实例(对于用户来说可能),如果你不需要这样做,那就不要实现它了(再次,如果没有实现的str将被称为repr)< / p>

另外,当在Idle解释器中输入内容时,它会自动调用对象的repr表示。或者,当您打印列表时,它会调用list.__str__(与list.__repr__相同),然后调用列表中包含的任何元素的repr表示。这解释了您获得的行为,并希望如何解决它

答案 2 :(得分:1)

def __ str __ (self):
    return f"Vertex: {self.label} {self.neighbours}"

#In most cases, this is probably the easiest and cleanest way to do it. Not fully sure how this code will interact with your list []. Lastly, any words or commas needed, just add them between the brackets; no further quotes needed.