Я пытаюсь разжечь объект класса (нового стиля), который я определил. Но я получаю следующее сообщение об ошибке:Почему у меня возникает ошибка в моем классе, определяющем __slots__ при попытке рассортировать объект?
>>> with open('temp/connection.pickle','w') as f:
... pickle.dump(c,f)
...
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
File "/usr/lib/python2.5/pickle.py", line 1362, in dump
Pickler(file, protocol).dump(obj)
File "/usr/lib/python2.5/pickle.py", line 224, in dump
self.save(obj)
File "/usr/lib/python2.5/pickle.py", line 331, in save
self.save_reduce(obj=obj, *rv)
File "/usr/lib/python2.5/pickle.py", line 419, in save_reduce
save(state)
File "/usr/lib/python2.5/pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "/usr/lib/python2.5/pickle.py", line 649, in save_dict
self._batch_setitems(obj.iteritems())
File "/usr/lib/python2.5/pickle.py", line 663, in _batch_setitems
save(v)
File "/usr/lib/python2.5/pickle.py", line 306, in save
rv = reduce(self.proto)
File "/usr/lib/python2.5/copy_reg.py", line 76, in _reduce_ex
raise TypeError("a class that defines __slots__ without "
TypeError: a class that defines __slots__ without defining __getstate__ cannot be pickled
Я не явно определить __slots__
в моем классе. Что-то я неявно определяю? Как мне обойти это? Мне нужно определить __getstate__
?
Обновление:gnibbler выбрал хороший пример. Класс объекта, который я пытаюсь раскрыть, обертывает сокет. (Теперь мне кажется, что) гнезда определяют __slots__
, а не __getstate__
. Я предполагаю, что, как только процесс завершится, другой процесс не может распасться и использовать соединение сокета предыдущего процесса. Поэтому, пока я принимаю превосходный ответ Alex Martelli, мне придется проводить другую стратегию, чем травление, чтобы «поделиться» ссылкой на объект.
Можете ли вы показать код из класса? Вероятно, нам не нужно видеть * все * методы. –