По умолчанию каждый экземпляр обычного класса в Python хранит свои атрибуты в собственном словаре __dict__. Это удобно (можно добавлять атрибуты на лету, в любой момент), но не бесплатно - словарь занимает существенно больше памяти, чем нужно было бы для хранения фиксированного набора полей. __slots__ - это способ отказаться от этой гибкости в обмен на экономию памяти.