Python 中的字符串转对象

4 投票
5 回答
37994 浏览
提问于 2025-04-16 20:03

我需要能够把任何对象的字符串表示转换回它在另一台电脑上的原始状态。这里我用一个叫做A的类作为例子:

    class A:
        def __init__(self):
            self.data = "test"
            self.name = "Bob"

        def __str__(self):
            return str(self.data) + " " + str(self.name)

类A的对象必须能够在另一台电脑上重新创建。所以如果另一台电脑收到了("A", "memberData memberName"),它就能把这个转换成类A的对象。我希望这能适用于任何用户自定义的对象。最好用户只需要创建一个toString()和toObject()的方法就行。

5 个回答

2

eval() 对我来说是有效的

    s='[{'name':'bob','org':"happy's place"}]'
    obj=eval(s)
    print(obj[0]['name'])

会返回 'bob'

2

如果你想把Python对象进行序列化和反序列化,pickle已经被认为是一个非常好且标准的解决方案。Python还使用repr来获取对象的字符串表示,这些字符串可以用来构造一个等效的对象。在你的情况下,最简单的方法是把dataname作为构造函数的参数,并定义一个使用数据成员的repr__repr__函数:

class A:
    def __init__(self, data, name):
        self.data = data
        self.name = name

    def __repr__(self):
        return "%s(%s,%s)" % (self.__class__.__name__, repr(self.data), repr(self.name))

然后你可以这样做:

a = A('test', 'Bob')
a_repr = repr(a)
a_copy = eval(a_repr)

以此类推。显然,对于更大、更复杂的类,这样做会变得困难。

13

你在寻找将对象进行序列化的方法;这是一个非常常见的问题。pickle 是标准的解决方案,你应该先了解一下它。如果你想让一个类可以被序列化,你需要在这个类里定义一些自定义的方法,并确保这个类所在的模块在源计算机和目标计算机上都能找到。然后你可以使用 pickle.dumps(obj),这会返回一个字符串,接着用 pickle.loads(my_str) 来重建这个对象。

其他的选择包括 marshal(低级别的)和 json(用于网络数据的标准格式)。

撰写回答