【问题标题】:Saving and Loading a Class Instance保存和加载类实例
【发布时间】:2016-02-06 21:04:11
【问题描述】:

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

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)

【问题讨论】:

    标签: python persistence pickle savestate


    【解决方案1】:

    所以我做了一个快速测试,没有任何问题:

    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
    

    有时,如果您的类的定义已更改,或者即使您重新定义了该类(可能通过再次运行一些代码),pickle 也会失败。例如,假设我像上面一样运行第一段代码,然后运行

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

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

    In [17]: player.__class__
    Out[17]: __main__.Character
    In [18]: player.__class__ == Character
    Out[18]: False
    
    In [20]: player2 = Character()
    In [21]: player2.__class__
    Out[21]: __main__.Character
    In [22]: player2.__class__ == Character
    Out[22]: True
    

    因此,您可能需要确保不会发生类似的事情。通常没关系,但如果变量名发生变化或其他情况,它可能会让你失望。

    【讨论】:

    • 另外,只是样式上的指针:您可以使用 with:“with open(filename) as f:”,而不是打开和关闭文件,这将在您离开上下文时自动关闭文件.有关示例,请参见 preshing.com/20110920/the-python-with-statement-by-example
    • 是的,我相信这就是正在发生的事情。我重新启动程序,当我这样做时导入我的类 Character() 模块,所以当我去加载 save.p 文件并将值分配给播放器时。它说播放器未定义。我怎样才能使这种事情起作用?我希望在整个游戏过程中更新玩家统计数据并在退出时保存,但以后可以重新加载。谢谢sheridp,我会改变的:)
    • 我让它工作了,这是我的错误。感谢您的帮助
    猜你喜欢
    • 1970-01-01
    • 2011-05-15
    • 1970-01-01
    • 1970-01-01
    • 2011-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-06
    相关资源
    最近更新 更多