Подтвердить что ты не робот

Печать списка объектов пользовательского класса

Итак, у меня есть класс, называемый 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 для каждого объекта. Есть ли способ сделать это?

4b9b3361

Ответ 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__), который вызывает в свою очередь репрезентативное представление любого элемента, содержащего список. Это объясняет поведение, которое вы получаете, и, надеюсь, как его исправить.