如何使用pickle保存程序中的所有对象?

时间:2015-07-02 13:33:04

标签: python save pickle

我一直在寻找有关泡菜的信息,我以为我已经把它想出来了,但我有一点问题让它正常工作。

所以我使用python 3.3.1。我有一个有很多房间的pygame游戏(大约200个),每个房间都是父类的子实例,很多都有自己的变量来跟踪他们房间里发生的各种事情。当玩家从一个房间走到另一个房间时,我当然希望当玩家保存游戏时玩家对每个房间所做的更改都会被保存。我有点双重问题。

所以这或多或少都是我做的事情:

import pickle
with gzip.GzipFile("Saved Games/"+file_name, 'wb') as output:
   pickle.dump(room001, output, pickle.HIGHEST_PROTOCOL)
   ...
   pickle.dump(room200, output, pickle.HIGHEST_PROTOCOL)
   pickle.dump(player, output, pickle.HIGHEST_PROTOCOL)

所以我想这可以节省。但是当我稍后加载它时,使用:

with gzip.GzipFile("Saved Games/"+file_name, 'r') as loadfile:
   room001 = pickle.load(loadfile)
   ...
   room200 = pickle.load(loadfile)
   player = pickle.load(loadfile)

起初一切似乎都没问题。它看起来没有问题,但后来我注意到游戏的表现有点奇怪。好像它没有使用从pickle加载的数据。

例如,一个房间可能有一些蜜蜂飞来飞去。我进入房间,看到蜜蜂正常,但当房间的事件功能试图让蜜蜂移动时,他们没有。 它看起来像这样:

def room001_events():

   room001.bee_pos_x += room001.bee_speed
   if room001.bee_pos_x < 0 or room001.bee_pos_x > 600:
       room001.bee_speed *= -1

在装载之前,蜜蜂会愉快地来回反弹,但在它之后,它们根本不会移动。所以我想知道我在加载过程中做错了什么。正在访问该功能,当我打印出值时,它们似乎正在改变,但屏幕上的蜜蜂不会移动。

另外,我想知道是否有某种方法可以迭代程序中的所有房间而无需单独列出它们。我已经尝试使用搁置按照this question,但它只是在加载时崩溃(它似乎与我可以告诉的表面有问题,因为它一直给我pygame.error:显示表面退出,即使我从未调用过完全是pygame.quit()。

1 个答案:

答案 0 :(得分:0)

你的问题不是泡菜。您的问题是假设从泡菜中恢复房间的状态足以让您在装入泡菜时正常运行。我愿意打赌你没有测试来验证这个假设。

保存(pickle)实例时,其实例变量的值将保存为pickle的一部分。当你重新加载它们时,通常不会调用__init__()方法,这可能是启动操作的方式。所以你确定泡菜中有足够的状态信息可以让它们从中断的地方恢复吗?

保存所有房间而不必单独列出的最简单方法是拥有一个包含房间的列表。然后,您的代码将引用(比方说)rooms[100]而不是room100,您可以通过单个语句来挑选rooms[]列表以保存它们。