Hello everyone in new layout of blog. Today I will write more about python ``__slots__``.
What exactly __slots__ do? Imagine that you have a two python classes- one with __slots__ and other without:
classSlots(object):__slots__=['arg1','arg2']def__init__(self,arg1,arg2):self.arg1=arg1self.arg2=arg2classNoSlots(object):def__init__(self,arg1,arg2):self.arg1=arg1self.arg2=arg2
Then instantiate them:
>>> slots=Slots(arg1='first',arg2='second')>>> no_slots=NoSlots(arg1='third',arg3='fourth')
At first there is no much difference between slots and no_slots instances, but when we use dir():
>>> len(dir(slots))26>>> len(dir(no_slots))27
So what is different? The answer is slots got __slots__ and no_slots: __dict__ and __weakref__. The implication of this is as follows:
>>> slots.arg3='fifth'AttributeError: 'Slots' object has no attribute 'arg3'>>> no_slots.arg3='sixth'>>> no_slots.arg3'sixth'
Thanks to not having __dict__. Slots class is a bit faster, but it's impossible to add attribute that is not in __slots__. Moreover there is no __weakref__ which means that it is not possible to cache this object.
Cover image by JohnsonMartin under CC0.