保存并加载类实例

时间:2016-02-06 21:04:11

标签: python persistence pickle savestate

我有一个创建新角色对象的类。

class Character():
    def __init__(self):
    self.name = None
    self.hp = None
    self.mp = None


class Race(Character):
    def __init__(self):
    super().__init__()
    self.race = None

它位于名为char的模块中。所以我有我的代码来创建一个新游戏。

    elif command == "new game":
        name_game = input('Name your game: ')

        cur_save=open('saves/' + name_game + '.p', 'wb')
        player = char.Character()
        player_name = input('Name your character: ')
        player.name = player_name
        player_race = input('What is your race? ')
        player.race = player_race
        pickle.dump(player, cur_save, -1)
        cur_save.close()

现在我想开始游戏并加载输入的玩家名称和种族。但是以下只是将玩家设置为未定义。

    cur_save=open('saves/' + name_game + '.p', 'rb')
    player = pickle.load(cur_save)

我希望它将player.name设置为保存的值,并与player.race相同。 还有其他我应该使用的东西,如数据库类的东西(MySQL)

1 个答案:

答案 0 :(得分:2)

所以我做了一个快速测试并且没有问题:

<input type="text" class="textbox" name="custom_reason" size="50" maxlength="120" value="">

我得到的是:

import pickle
class Character():
    def __init__(self):
        self.name = None
        self.hp = None
        self.mp = None


class Race(Character):
    def __init__(self):
        super().__init__()
        self.race = None

name_game = input('Name your game: ')

cur_save=open('saves/' + name_game + '.p', 'wb')
player = Character()
player_name = input('Name your character: ')
player.name = player_name
player_race = input('What is your race? ')
player.race = player_race
pickle.dump(player, cur_save, -1)
cur_save.close()

cur_save=open('saves/' + name_game + '.p', 'rb')
player = pickle.load(cur_save)
print(player.name)

有时候,如果你的类的定义发生了变化,或者你重新定义了类(可能是再次运行一些代码),我发现事情会因为泡菜而失败。例如,假设我运行上面的第一段代码,然后运行

%run temp.py
Name your game: test
Name your character: Brian
What is your race? human
Brian

再次,基本上重新定义了角色。然后你可以得到不直观的行为:

class Character():
    def __init__(self):
        self.name = None
        self.hp = None
        self.mp = None

所以你可能想确保这样的事情没有发生。通常情况并不重要,但如果变量名称发生变化或其他原因,它可能会让你失望。