Sto provando a decapitare un oggetto di una (nuova) classe che ho definito. Ma sto ottenendo il seguente errore:Perché ricevo un errore sulla mia classe che definisce __slots__ quando provo a decapitare un oggetto?
>>> 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
non mi definisco esplicitamente __slots__
nella mia classe. Qualcosa che ho implicitamente definito? Come posso aggirare questo? Devo definire __getstate__
?
Aggiornamento:gnibbler ha scelto un buon esempio. La classe dell'oggetto che sto cercando di sottacere avvolge una presa. (Mi viene in mente ora che) le prese definiscono __slots__
e non __getstate__
per una buona ragione. Presumo che una volta terminato un processo, un altro processo non possa annullare l'operazione e utilizzare la connessione socket del processo precedente. Quindi, mentre sto accettando l'eccellente risposta di Alex Martelli, dovrò seguire una strategia diversa dal pickling per "condividere" il riferimento all'oggetto.
Puoi mostrare del codice dalla classe? Probabilmente non abbiamo bisogno di vedere * tutti * i metodi. –