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语法)。您不能picklePySwigObjects
,但是这里有一个解决方法:这是一个老问题,名称非常通用,所以,如果您现在看到它,您可能希望设置类的\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是通过使用新样式类修复的“奇怪行为”的一部分。