如何使用 __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])
,当eval
uated 时,它将调用构造函数并创建该类的新实例。
【讨论】:
以上是关于如何使用 __repr__ 从中创建新对象?的主要内容,如果未能解决你的问题,请参考以下文章
如何直接使用 `str.format` 作为 `__repr__`?