Saving Object State with Pickle (objects containing objects)
我正在尝试解决如何将带有
问题是,
当我尝试序列化时:
1 2 | with open('gsave.pkl', 'wb') as output: pickle.dump(world.objects, output, pickle.DEFAULT_PROTOCOL) |
我得到以下错误:
所以,我的问题是:存储
更新我认为我的问题不是对象存储在哪里;而是类
1 2 3 4 5 6 7 8 9 10 11 | 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) |
完成后,我将有一个新的对象,如
但这会带来一个问题,因为在pickle时,它找不到对类的静态引用来解构或重建对象…所以失败了。
我还能做什么?(除了为我要实例化到我的世界中的每种类型的对象创建文本类引用之外。)
pickle不pickle类,而是依赖于对类的引用,如果类是动态生成的,则这些类不起作用。(此答案在文件中有适当的运用和加粗)
因此,pickle假定如果对象来自名为
我不确定如何向您演示此方法,我需要有关您的设置的更多信息来建议如何实现此方法,但我可以对其进行描述:
首先,您要创建一个函数或
这是快速而肮脏的解决方案。假设类名与
在我看来,这绝对是一种方法,而不是使用
- 不是
type 的子类,因此这些实例是可pickle的。 - 当一个实例被调用时,它会构造一个新的游戏对象,该对象具有对该对象类型的引用。
因此,假设您有一个名为
1 2 3 4 5 6 7 8 9 | class ObjectType: def __init__(self, name, description): self.item_name = name self.base_item_description = description #other qualities common to all objects of this type def __call__(self, cost, level, hp): #other qualities that are specific to each item return GameObject(cls=self, cost=cost, level=level, hp=hp) |
这里我使用