Python __slots__

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:

class Slots(object):
    __slots__ = ['arg1', 'arg2']

    def __init__(self, arg1, arg2):
        self.arg1 = arg1
        self.arg2 = arg2

class NoSlots(object):
    def __init__(self, arg1, arg2):
        self.arg1 = arg1
        self.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.