I think the main purpose of __slots__ is to save the memory usage by allowing to specify properties explicitly, instead of using __dict__ allowing dynamic property assignment on the instances. So I somehow understand why __dict__ is removed by default when using __slots__. But why does it meanwhile remove __weakref__ by default?
Reference: https://docs.python.org/3/reference/datamodel.html#slots
I can't read minds, but I suspect the rationale goes like this:
__weakref__ wasn't disabled by default when using __slots__, providing a way to save the associated memory explicitly would require yet another special opt-out mechanismGiven how infrequently weak references are used at all, it was probably deemed simpler to simply have it disabled by default, with the option to opt back in.
Diving to implementation details, in a sense, unslotted user-defined classes have precisely two "slots" (one for __dict__, one for __weakref__) over and above the base object header, so having __slots__ say "Replace the default with this explicit list" makes it natural to remove both __dict__ and __weakref__ when __slots__ comes into play.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With