Krzysztof Żuraw Blog

Python __slots__

January 23, 2016

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.

Tagged with python slots

I turned off Disqus comments. If you want to give me feedback please write to krzysztof.zuraw(at)fastmail.com or use Keybase.


Krzysztof ŻurawDelivered by Krzysztof Żuraw. Opinions are my own. You can follow updates via RSS feed.