2012-04-24 2 views
0

У меня есть простой класс, чтобы просто хранить данные, которые связаны с печатной платой, как это:рассол экземпляр питон класса

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 

Я использую маринованные в другом классе, чтобы сохранить 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 

Эта доскаКласс очень простой контейнер. Почему его нельзя мариновать?

+1

[PEP 8] (http://www.python.org/dev/peps/pep-0008/) хотели бы вы назвать ваш класс 'Board' (а не' BoardClass', как вы знаете, это класс), 'setMode'' set_mode' и т. д. Также такие вещи, как пробелы после двоеточий в литерале dict и пробелы вокруг присваивания '='. Наконец, вы должны сделать 'class Board (object)', чтобы сделать его классом нового стиля. –

+3

Ваш код не имеет смысла в его нынешнем виде. В каком классе определяется 'onSave'? Где 'boardName' определяется в' onSave'? Откуда появляется «PySwigObject» (вы явно делаете больше на доске, чем вы показали)? –

+0

Крис, не имеет значения, где onSave() определяется его в другом классе и будет вызываться, когда пользователь хочет сохранить доску. (Или код, чтобы рассортировать его). Я не знаю, откуда PySwigObject приходит от меня. t есть, что в моем коде и для маринованной части это все код. Также выполнение класса Board (object) ничего не решило. –

ответ

3

Вместо inherting из «ничего», наследуют от «объекта» - таким образом ваш класс больше не будет «Class Instance» - это будет правильный экземпляр класса нового стиля, и как таковой , быть "pickeable"

другими словами, просто попробуйте изменить эту строку:

class boardClass(): 

к этому:

class boardClass(object): 
1

Если вы действительно ш ant, чтобы сохранить ваш объект таким, что он не принимает «объект» в аргументе, вы можете использовать сериализатор, такой как dill или cloudpickle, который может сериализовать как экземпляры класса старого, так и нового стиля (для обоих python 2.x и 3.x синтаксисы).

1

Вы не можете замариновать PySwigObjects, однако есть обходной путь здесь: Pickling objects

Смежные вопросы