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

cza*_*doz 51 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))
Run Code Online (Sandbox Code Playgroud)

我想打印这个类的对象列表,如下所示:

x = [Vertex(1), Vertex(2)]
print x
Run Code Online (Sandbox Code Playgroud)

但它显示我这样的输出:

[<__main__.Vertex instance at 0xb76ed84c>, <__main__.Vertex instance at 0xb76ed86c>]
Run Code Online (Sandbox Code Playgroud)

实际上,我想打印Vertex.label每个对象的值.有什么办法吗?

Dan*_*man 62

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

print [vertex.label for vertex in x]
Run Code Online (Sandbox Code Playgroud)

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

def __repr__(self):
    return str(self)
Run Code Online (Sandbox Code Playgroud)

  • 我认为你需要这样写 print( [vertex.label for vertex in x]) (2认同)

Ant*_*Ant 13

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

__repr__并且__str__是python中的两个不同的东西.(但是,请注意,如果您仅定义了__repr__,class.__str__则会将一个调用转换为调用class.__repr__)

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

另一方面,目标__str__是可以重新获得; 所以如果你必须在屏幕上打印实例(可能是对于用户),如果你不需要这样做,那么就不要实现它(如果未实现的str将被称为repr)

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

  • 不,解释器正在调用 list.__str__() (或 repr,这取决于,但这是同一件事)并且 list.__str__ 返回一个字符串,该字符串由调用列表包含的所有对象的 repr 组成 (2认同)