4

次のような回路基板に関連付けられているデータを格納するだけの単純なクラスがあります。

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

4 に答える 4

5

「何もない」から継承する代わりに、「オブジェクト」から継承します。このようにして、クラスは「クラスインスタンス」ではなくなります。新しいスタイルのクラスの適切なインスタンスになり、「選択可能」になります。

つまり、次の行を変更してみてください。

class boardClass():

これに:

class boardClass(object):

更新: この回答は Python 2 時代からのものであり、オブジェクトから明示的に継承する必要がありました。Python 3 ではそうではなくなりました: からの継承objectは自動的に行われ、pickle が失敗する場合は別の理由によるものです。

于 2012-04-25T03:05:46.110 に答える
1

pickle はできませんがPySwigObjects、ここに回避策があります: Pickling objects

于 2015-01-22T14:41:15.093 に答える
1

引数に「オブジェクト」を使用しないようにオブジェクトを保持したい場合は、古いスタイルと新しいスタイルのクラス インスタンスの両方をシリアル化できるシリアライザーを使用できます (python 2.x と 3.x の両方の場合) dillcloudpicklex 構文)。

于 2014-07-10T03:41:07.657 に答える