pickle python类实例

时间:2012-04-24 23:54:46

标签: python pickle

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

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是非常简单的容器。为什么不能腌制?

4 个答案:

答案 0 :(得分:3)

不是从“无”入侵,而是从“对象”继承 - 这样你的班级将不再是“班级实例” - 它将会是 一个新风格的适当实例,因此,是“可以制作的”

换句话说,只需尝试更改此行:

class boardClass():

到此:

class boardClass(object):

答案 1 :(得分:1)

如果你真的想保持你的对象不会采取对象"在参数中,您可以使用像dillcloudpickle这样的序列化程序,它可以序列化旧式和新式类实例(对于python 2.x和3.x语法)。

答案 2 :(得分:1)

你不能挑选PySwigObjects,但这里有一个解决方法:Pickling objects

答案 3 :(得分:0)

这是一个古老的问题,名称很通用,因此,如果现在看到它,您可能希望设置类的__getstate____setstate__,以便pickle知道如何转储和加载您定义了课程。

在此处查看examples

如果您的类很简单(例如,只有整数和字符串作为成员以及任何方法),那么它应该可以自动选择。