Как я могу сохранить объект со списком, используя pickle в python? - PullRequest
0 голосов
/ 17 октября 2018

Я пытаюсь сохранить объект со списком объектов другого класса.

    def loadBot(self, name):

       BotFile = open('../Bots/' + name, 'rb+')

       self.CurrentBot = pickle.load(BotFile)

       BotFile.close() # Closes file

    def saveBot(self, bot):

       BotFile = open('../Bots/' + bot.Name, 'wb+') 

       BotFile.truncate() # Clear File
       pickle.dump(bot, BotFile, protocol=pickle.HIGHEST_PROTOCOL) 

       BotFile.close() # Close file

Это функции, которые я использую для загрузки объекта и сохранения.В объекте Bot у меня есть список объектов 'Blueprint' и функция add blueprint.

    class ChatBot:

       Name = 'DefaultName'
       Token = 'DefaultToken'
       bot_blueprints = []

       def __init__(self, Name, Token):
         self.Name = Name
         self.Token = Token

      def addBlueprint(self):
        self.bot_blueprints.append(Blueprint(len(self.bot_blueprints))) 

Я добавляю новый элемент и проверяю размер списка перед сохранением и после

app.loadBot('A')
print(len(app.CurrentBot.bot_blueprints))
app.CurrentBot.addBlueprint()
app.saveBot(app.CurrentBot)
print(len(app.CurrentBot.bot_blueprints))

Это начинается с0, после добавления bp становится 1. После этого я закрываю приложение, запускаю его второй раз, и мой код должен написать 1 после открытия и 2 после добавления, но все равно 0 и 1. Размер файла растет, но pickle не может правильно загрузить мой файл.

1 Ответ

0 голосов
/ 17 октября 2018

как вы написали код bot_blueprints - это переменная уровня класса, а не уровень экземпляра.таким образом, есть только один во всей программе, а не один для каждого ChatBot

Я бы переставил класс так, чтобы он был больше похож на:

class ChatBot:
   def __init__(self, name, token):
     self.name = name
     self.token = token
     self.bot_blueprints = []

  def addBlueprint(self):
    self.bot_blueprints.append(Blueprint(len(self.bot_blueprints))) 
...