Tôi đang cố gắng chọn một đối tượng của một lớp (kiểu mới) mà tôi đã xác định. Nhưng tôi nhận được lỗi sau:Tại sao tôi nhận được lỗi về lớp học của tôi xác định __slots__ khi cố gắng chọn một đối tượng?
>>> 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
Tôi không xác định rõ ràng __slots__
trong lớp học của mình. Có phải tôi đã định nghĩa điều gì đó không? Tôi làm cách nào để giải quyết vấn đề này? Tôi có cần xác định __getstate__
không?
Cập nhật:gnibbler chọn ví dụ điển hình. Lớp của đối tượng tôi đang cố gắng để kết thúc tốt đẹp một ổ cắm. (Nó xảy ra với tôi bây giờ mà) ổ cắm xác định __slots__
và không __getstate__
vì lý do chính đáng. Tôi giả sử một khi một quá trình kết thúc, một quá trình khác không thể tháo bỏ và sử dụng kết nối socket của quá trình trước đó. Vì vậy, trong khi tôi chấp nhận câu trả lời tuyệt vời của Alex Martelli, tôi sẽ phải theo đuổi một chiến lược khác hơn là chọn "chia sẻ" đối tượng tham chiếu.
Bạn có thể hiển thị một số mã từ lớp học không? Có lẽ chúng ta không cần phải xem * tất cả * các phương pháp. –