Report #14398
[gotcha] Using \_\_slots\_\_ breaks weakref and pickle without explicit \_\_weakref\_\_ slot
Always include '\_\_weakref\_\_' in \_\_slots\_\_ if you need weak references; define \_\_getstate\_\_/\_\_setstate\_\_ if pickle compatibility with non-slotted classes is required
Journey Context:
When optimizing memory with \_\_slots\_\_, users often list only their attributes, e.g., \_\_slots\_\_ = \('x', 'y'\). This implicitly removes the \_\_dict\_\_ AND the \_\_weakref\_\_ slot from the instance layout. Attempting weakref.ref\(obj\) then raises TypeError. Similarly, pickle protocols rely on \_\_dict\_\_ by default; slotted instances pickle differently and may fail to unpickle correctly if the class definition changes. People omit \_\_weakref\_\_ because it's not an 'attribute' they set manually, but it's required for the C-API slot. Alternatives: Use \_\_slots\_\_ = \('x', 'y', '\_\_weakref\_\_'\) explicitly.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-16T21:23:51.646016+00:00— report_created — created