从文本表示重构Python对象

时间:2012-05-10 18:41:01

标签: python object

是否可以在屏幕上repr显示python对象的表示文本时创建一个对象?

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

或者一旦将对象表示为stdout,它是否会获得GCd?

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

3 个答案:

答案 0 :(得分:2)

repr的输出可能能够重建对象,但是约定是,如果它有由尖括号包围的位,则这些位不可重构。

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

答案 1 :(得分:1)

事实并非如此,因为显然文字呈现不一定包含对象的所有信息。

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

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

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

答案 2 :(得分: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})