6

这是我真的不明白的东西。我正在尝试__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__()
4

2 回答 2

2

__repr__(),必须返回一个字符串,否则很多代码会中断。

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

second = eval(repr(first))

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

使用酸洗进行序列化或json模块。要克隆,请使用复制构造函数

于 2014-01-08T13:07:21.427 回答
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,将调用构造函数并创建该类的新实例。

于 2014-01-08T13:19:46.230 回答