我需要能够将对象的任何字符串表示形式转换回另一台计算机上的原始状态。我将使用班级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()方法。
答案 0 :(得分:11)
您正在研究序列化对象的方法;这是一个非常标准的问题。 pickle
是标准解决方案,您应该首先查看它。如果要创建类pickleable,则需要在其上定义一些自定义方法,并确保在源计算机和目标计算机上都可以找到定义它的模块。然后你可以pickle.dumps(obj)
返回一个字符串,pickle.loads(my_str)
重建对象。
其他选项包括marshal
(低级)和json
(网络数据标准)。
答案 1 :(得分:2)
答案 2 :(得分:1)
泡菜和搁架可能很有用。 E.g。
import shelve
a = A();
db = shelve.open('myclasses')
db['a'] = a
db.close()
这将创建将存储您的类的文件myclasses。
答案 3 :(得分:1)
如果要对python对象进行序列化和反序列化,pickle已经被指出是一个非常好的标准解决方案。 Python还使用repr来获取可能用于构造等效对象的对象的字符串表示。在您的情况下,最简单的方法是添加data
和name
作为构造函数参数,并使用__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)
等等。显然,对于更大,更复杂的课程来说,这将变得困难。
答案 4 :(得分:0)
Pickle似乎是正确的选择。
您可能希望使用dump()
和load()
方法来保存并从字符串中获取对象。
# The object to pickle
object_pi = myDict
# Dump the data as string to file
pickle.dump(object_pi, filename)
# The file with serialized data to retrieve
fileHandler = open(filename, 'r')
# The data is stored into my_object variable
my_object = pickle.load(fileHandler)
答案 5 :(得分:0)
eval()对我有用
s='[{'name':'bob','org':"happy's place"}]'
obj=eval(s)
print(obj[0]['name'])
将返回“ bob”