繁体   English   中英

如何在python中使用pickle保存带有列表的对象?

[英]How can i save object with list using pickle in python?

我正在尝试使用其他类对象的列表保存对象。

    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。文件大小增大,但泡菜不能正确显示加载我的文件。

您编写代码bot_blueprints是类级别的变量,而不是实例级别的变量。 因此整个程序中只有一个,而不是每个ChatBot都有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))) 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM