3

当它们repr在屏幕上出现时,是否可以从 python 对象的表示文本创建一个对象?

>>> select.select([s], [],[])
([<socket._socketobject object at 0x7f274914c600>], [], [])
>>> eval('<socket._socketobject object at 0x7f274914c600>') # Fail

或者一旦对象被表示为标准输出,它会得到 GCd 吗?

用处不大,但在使用 Python CLI 时,它可能偶尔会有所帮助。

4

3 回答 3

2

的输出repr可能能够重建对象,但惯例是,如果它的位被尖括号包围,那么这些位是不可重建的。

因此,在这种情况下,您无法重建套接字,是的,它将立即被垃圾收集。

于 2012-05-10T18:42:36.137 回答
1

它不是,因为显然文本呈现不一定包含对象的所有信息。

如果您想使用类似文本的对象表示,请尝试 JSON 模块。

http://docs.python.org/library/json.html?highlight=json#json

另请注意,此演示文稿中封装的对象不能具有本机对象绑定,如套接字、文件句柄等。

于 2012-05-10T18:43:17.250 回答
1

鼓励您创建repr允许您通过粘贴输出来创建新对象的对象repr,但这不是严格执行的。根据对象的性质和任何内部结构,这也可能不是一件容易做到的事情。

有很多方法可以做到这一点。这是一种方法的非常简单的示例:

class ReprObject(object):
    def __init__(self, value, item):
        self.value = value
        self.item = item

    def __repr__(self):
        return '%s(**%r)' % (self.__class__.__name__, self.__dict__)

然后我们把它带到交互式解释器并创建一个实例:

>>> r = ReprObject(value=1, item=True)
>>> r
ReprObject(**{'item': True, 'value': 1})

现在复制/粘贴它repr并使用它来创建一个新对象:

>>> r2 = ReprObject(**{'item': True, 'value': 1})
>>> r2
ReprObject(**{'item': True, 'value': 1})

并且eval()也可以工作:

>>> eval(repr(r2))
ReprObject(**{'item': True, 'value': 1})
于 2012-05-10T18:54:49.703 回答