Печать списка объектов пользовательского класса
Итак, у меня есть класс, называемый 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
для каждого объекта.
Есть ли способ сделать это?
Ответы
Ответ 1
Если вы просто хотите напечатать метку для каждого объекта, вы можете использовать цикл или понимание списка:
print [vertex.label for vertex in x]
Но чтобы ответить на ваш исходный вопрос, вам нужно определить метод __repr__
, чтобы получить правильный вывод списка. Это может быть что-то простое:
def __repr__(self):
return str(self)
Ответ 2
Если вам нужно немного больше информации, кроме ответа Даниэля Розмана:
__repr__
и __str__
- две разные вещи в python. (обратите внимание, однако, что если вы определили только __repr__
, вызов class.__str__
переводится в вызов class.__repr__
)
Цель __repr__
- быть однозначной. Кроме того, если возможно сервер, вы должны определить реестр так, чтобы (в вашем случае) eval(repr(instance)) == instance
С другой стороны, цель __str__
должна быть переименована; так что имеет значение, если вам нужно распечатать экземпляр на экране (для пользователя, возможно), если вам не нужно это делать, тогда не реализуйте его (и опять же, если str в не реализован будет называться repr)
Кроме того, при типе объектов в интерпретаторе Idle он автоматически вызывает репрезентативное представление вашего объекта. Или когда вы печатаете список, он вызывает list.__str__
(который идентичен list.__repr__
), который вызывает в свою очередь репрезентативное представление любого элемента, содержащего список. Это объясняет поведение, которое вы получаете, и, надеюсь, как его исправить.