【发布时间】:2017-05-14 00:52:14
【问题描述】:
我正在尝试弄清楚如何将带有Pickle 的对象序列化到保存文件中。我的示例是一个名为World 的对象,该对象有一个list(名为objects),其中可能包含数百个不同类类型的实例化对象。
问题是Pickle 不允许我序列化World.objects 列表中的项目,因为它们没有被实例化为World 的属性。
当我尝试序列化时:
with open('gsave.pkl', 'wb') as output:
pickle.dump(world.objects, output, pickle.DEFAULT_PROTOCOL)
我收到以下错误:
_pickle.PicklingError: Can't pickle <class 'world.LargeHealthPotion'>:attribute lookup LargeHealthPotion on world failed
那么,我的问题是:存储world.objects 列表项的替代方法是什么,以便它们成为world 的属性,而不是未保存的列表项?
更新
我认为我的问题不在于对象的存储位置;而是 LargeHealthPotion 类(和许多其他类)是通过以下操作在 World 类中动态创建的:
def __constructor__(self, n, cl, d, c, h, l):
# initialize super of class type
super(self.__class__, self).__init__(name=n, classtype=cl, description=d, cost=c,
hp=h, level=l)
# create the object class dynamically, utilizing __constructor__ for __init__ method
item = type(item_name,
(eval("{}.{}".format(name,row[1].value)),),
{'__init__':__constructor__})
# add new object to the global _objects object to be used throughout the world
self._objects[item_name] = item(obj_name, obj_classtype, obj_description, obj_cost,
obj_hp, obj_level)
完成后,我将拥有一个像 <world.LargeHealthPotion object at 0x103690ac8> 这样的新对象。我动态地这样做是因为我不想显式地为我的世界中每种不同类型的对象创建数百个不同类型的类。相反,我在迭代我想要创建的项目名称(及其统计信息)时动态创建类。
但这引入了一个问题,因为在酸洗时,它无法找到对类的静态引用以解构或重建对象......所以它失败了。
我还能做什么? (除了为每种类型的对象创建字面类引用之外,我将在我的世界中实例化。)
【问题讨论】:
-
而不是创建数千个类,您可以拥有一个信息字典(名称、类类型、描述、成本、hp、级别),然后每个对象都有一个属性,将其指向字典中的正确条目?
-
您甚至可以使用
property进行查找,这样您仍然可以像访问类属性一样访问信息。 PS:你可以看看stackoverflow.com/questions/4235078/… -
@TadhgMcDonald-Jensen,关于字典的想法,我并不完全关注你。我意识到我可以将所有项目存储在字典中,但我仍然必须创建对象来引用字典元素的每个数据点。这些对象会导致与 pickle 相同的问题,因为我必须动态创建对象。
标签: python-3.x oop object pickle