从文本表示重构Python对象

从文本表示重构Python对象,python,object,Python,Object,当python对象在屏幕上显示时,是否可以从python对象的表示文本创建对象 >>> select.select([s], [],[]) ([<socket._socketobject object at 0x7f274914c600>], [], []) >>> eval('<socket._socketobject object at 0x7f274914c600>') # Fail >>选择。选择([s]、[]、[])) ([

当python对象在屏幕上显示时,是否可以从python对象的表示文本创建对象

>>> select.select([s], [],[])
([<socket._socketobject object at 0x7f274914c600>], [], [])
>>> eval('<socket._socketobject object at 0x7f274914c600>') # Fail
>>选择。选择([s]、[]、[]))
([], [], [])
>>>评估(“”)#失败
或者,一旦对象被表示为stdout,它会得到GCd吗


不是很有用,但在使用Python CLI时,它偶尔会有所帮助。

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


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

事实并非如此,因为显然文本表示不一定包含对象的所有信息

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


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

我们鼓励您创建对象,通过粘贴
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})

如果我试图序列化和对象,我会。但是,如果在cli中无法捕获输出,我想知道是否可以在事后捕获。(如果对象仍然存在,那么内存地址是否足以重建它)我也这么怀疑-我想我会问SO专家:)