2016-02-06 2 views
1

У меня есть класс, который создает новый объект символа.Сохранение и загрузка экземпляра класса

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)

ответ

2

Так что я сделал быстрый тест и не имеют никаких проблем:

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 

снова, по существу, переопределение Character. Тогда вы можете получить неинтуитивное поведение:

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 

Таким образом, вы можете захотеть убедиться, что что-то подобное не происходит. Обычно это не имеет значения, но если переменные имена меняются или что-то в этом роде, это может отбросить вас.

+1

Кроме того, просто указатель на стиль: вместо открытия и закрытия файла вы можете использовать: «с открытым (имя файла) как f:», который автоматически закроет файл, когда вы покинете контекст. См. Http://preshing.com/20110920/the-python-with-statement-by-example/ для примера. – sheridp

+0

Да, я верю, что это то, что происходит. Я перезапускаю программу, и когда я это делаю, он импортирует мой класс Character(), поэтому, когда я иду загрузить файл save.p и присваиваю значения игроку. Он говорит, что игрок не определен. Как я могу сделать такую ​​работу? Я хочу, чтобы статистика игроков обновлялась по всей игре и сохранялась при выходе, но позже могла быть перезагружена. И спасибо, sheridp, я изменю это :) – Arkyris

+0

Я получил его на работу, это была ошибка на моем конце. спасибо за помощь – Arkyris