pickle python类实例

pickle python类实例,python,pickle,Python,Pickle,我有一个简单的类来存储与电路板相关的数据,如下所示: class boardClass(): def __init__(self,boardName): self.__name=boardName self.__boardMappings= {boardName:{ 'FastMode': {'CPU_A':{'mipi

我有一个简单的类来存储与电路板相关的数据,如下所示:

class boardClass():

    def __init__(self,boardName):
        self.__name=boardName
        self.__boardMappings= {boardName:{
                                  'FastMode':
                                  {'CPU_A':{'mipi':[], 'gpen':[]},
                                   'CPU_B':{'mipi':[], 'gpen':[]}

                                  'SlowMode':
                                  {'CPU_A':{'mipi':[], 'gpen':[]},
                                   'CPU_B':{'mipi':[], 'gpen':[]}                                   
                                  }
                                 }                       
                               }


    def setMode(self, board, mode, cpu,mipi,gpen):
        self.__boardMappings[board][mode][cpu]['mipi']=mipi
        self.__boardMappings[board][mode][cpu]['gpen']=gpen

    def getName(self):
        return self.__name
我在另一个类中使用pickle将
boardClass
数据存储在文件中,然后读取它们:

def onSave(self,boardName):
        board=boardClass.boardClass(boardName)
        name=boardName+".brd"
        file=open(name,"wb")            
        pickle.dump(board,file)                        
        loadedBoard= pickle.load( open( file, "rb" ))            
        print "Loaded board name is : ",loadedBoard.getName()
当我调用
onSave()
方法来pickle boardClass时,它给出了几个错误,最后以这个结尾:

File "C:\Python27\lib\copy_reg.py", line 70, in _reduce_ex
raise TypeError, "can't pickle %s objects" % base.__name__
TypeError: can't pickle PySwigObject objects
这个boardClass是一个非常简单的容器。为什么它不能被腌制?

不是从“无”继承,而是从“对象”继承- 这样,您的类将不再是“类实例”-而是 新样式类的适当实例,因此,必须是“可拾取的”

换言之,请尝试更改此行:

class boardClass():
为此:

class boardClass(object):

更新:这个答案来自Python 2时代——这里需要显式地从对象继承。在Python3中,情况已不再如此:从
对象继承是自动的,如果pickle失败,则是由于其他原因。

如果您确实希望保留对象,使其不在参数中使用“object”,您可以使用类似于
dill
cloudpickle
的序列化程序来序列化新旧样式的类实例(对于python 2.x和3.x语法)。

您不能pickle
PySwigObjects
,但是这里有一个解决方法:

这是一个老问题,名称非常通用,所以,如果您现在看到它,您可能希望设置类的
\uuu getstate\uuu
\uuu setstate\uuu
,以便pickle知道如何转储和加载您定义的类

看这里


如果您的类很简单(例如,只有int和字符串作为成员和任何方法),那么它应该是可自动选取的

想让你给你的类命名为
Board
(不是
BoardClass
,因为你知道它是一个类),
setMode
set\u mode
,等等。还有像dict文本中冒号后面的空格和赋值中
=
周围的空格。最后,您应该执行
类Board(object)
以使其成为一个新样式的类。在哪个类中定义了
onSave
?在
onSave
中定义的
boardName
在哪里?
PySwigObject
从何而来(很明显,你在电路板上做的事情比你展示的要多)?Chris,onSave()在另一个类中定义在何处并不重要,当用户想要保存电路板时将调用它。(或编写代码来pickle它)我不知道PySwigObject是从哪里来的,我的代码中没有这个,对于pickle部分,这就是所有的代码。同样,做类板(对象)并不能解决任何问题。好吧,有了代码,它就可以工作了。(试试看。)你还有其他一些重要的代码没有显示出来。我的第一个评论(几乎)纯粹是关于风格问题;除了新样式的类位(它将修复不清楚的地方的一些奇怪行为),它不会改变任何功能。可pickle是通过使用新样式类修复的“奇怪行为”的一部分。