Как использовать __repr__ для создания из него нового объекта?

Это то, что я на самом деле не понимаю. Я пытаюсь использовать __repr__ создать новый объект из его вывода.

У меня есть класс, OrderedSet, который содержит список и методы для его организации. Метод str этого класса

def __str__(self):
    s = "Set contains: "
    for elem in self.list: s += (" '" + elem + "'")
    return s

Теперь я должен использовать __repr__ таким образом, чтобы создать из него новый объект. подобно Orderedset second = repr(first)

Могу ли я просто сделать это так?

def __repr__(self):
    return self.list.__str__()

2 ответа

Решение

Идея "использования" __repr__ создавать новые объекты "является то, что на выходе __repr__ может быть допустимым кодом Python, который при интерпретации с eval, создает (копию) исходного объекта. Например, repr("foo") вернуть "foo" (в том числе "), или же repr([1,2,3]) возвращается [1,2,3],

В вашем примере вам, вероятно, нужно что-то вроде этого:

def __repr__(self):
    return "OrderedSet(%r)" % self.list

а также соответствующий конструктор:

def __init__(self, elements):
    self.list = elements

Сюда, repr(OrderedSet([1,2,3])) возвращает строку OrderedSet([1,2,3]), который, когда evalбудет вызывать конструктор и создавать новый экземпляр класса.

Нет. __repr__() должен вернуть строку, или много кода сломается.

Попробуйте этот подход: __repr__() должен вернуть действительный код Python. Это позволило бы вам

second = eval(repr(first))

Тем не менее, вся идея выглядит сомнительной. Такое чувство, что вы пытаетесь придумать умный способ сериализации или клонирования объектов.

Используйте травление для сериализации или, возможно, json модуль. Чтобы клонировать, используйте конструктор копирования.

Другие вопросы по тегам