如何使用__repr__从中创建新对象?

时间:2014-01-08 13:02:52

标签: python 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 个答案:

答案 0 :(得分:1)

“使用__repr__创建新对象”背后的想法是__repr__ can be valid python code的输出,当用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用时,它将调用构造函数并创建该类的新实例。

答案 1 :(得分:0)

没有。 __repr__()必须返回一个字符串或许多代码会中断。

尝试这种方法:__repr__()应返回有效的Python代码。这将允许你

second = eval(repr(first))

那就是说,整个想法看起来很可疑。感觉就像你试图想出一种聪明的方法来序列化或克隆对象。

使用pickling进行序列化或使用json模块。要克隆,请使用copy constructor