我有一个简单的类来存储与电路板相关的数据,如下所示:
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()
方法来挑选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是非常简单的容器。为什么不能腌制?
答案 0 :(得分:3)
不是从“无”入侵,而是从“对象”继承 - 这样你的班级将不再是“班级实例” - 它将会是 一个新风格的适当实例,因此,是“可以制作的”
换句话说,只需尝试更改此行:
class boardClass():
到此:
class boardClass(object):
答案 1 :(得分:1)
如果你真的想保持你的对象不会采取对象"在参数中,您可以使用像dill
或cloudpickle
这样的序列化程序,它可以序列化旧式和新式类实例(对于python 2.x和3.x语法)。
答案 2 :(得分:1)
你不能挑选PySwigObjects
,但这里有一个解决方法:Pickling objects
答案 3 :(得分:0)
这是一个古老的问题,名称很通用,因此,如果现在看到它,您可能希望设置类的__getstate__
和__setstate__
,以便pickle知道如何转储和加载您定义了课程。
在此处查看examples。
如果您的类很简单(例如,只有整数和字符串作为成员以及任何方法),那么它应该可以自动选择。