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