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

Posted

技术标签:

【中文标题】如何使用 __repr__ 从中创建新对象?【英文标题】:How to use __repr__ to create new object from it? 【发布时间】:2014-01-26 14:24:37 【问题描述】:

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

【问题讨论】:

eval(repr(some_object))?参见例如here. 附带说明:list 是一个错误的变量名,因为有一个同名的内置函数。 【参考方案1】:

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

试试这个方法:__repr__() 应该返回有效的 Python 代码。这样你就可以

second = eval(repr(first))

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

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

【讨论】:

【参考方案2】:

“使用__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]),当evaluated 时,它将调用构造函数并创建该类的新实例。

【讨论】:

以上是关于如何使用 __repr__ 从中创建新对象?的主要内容,如果未能解决你的问题,请参考以下文章

如何为函数本身设置 repr? [复制]

如何直接使用 `str.format` 作为 `__repr__`?

如何使用 SWIG 为 C++ 类提供 Python __repr__()

如何设置显示内容而不是显示对象

我们如何获得 __repr__() 的默认行为?

Python面向对象编程第11篇 特殊方法之__str__和__repr__