Вопрос с собеседования · Python

Что такое __slots__ и когда его использовать?

MiddleВнутреннее устройство
Ещё спрашивают так:
  • Как уменьшить память под миллион объектов в Python?
Коротко

__slots__ = ("x", "y") заменяет у экземпляров словарь __dict__ на фиксированные ячейки: объект занимает в несколько раз меньше памяти, доступ к атрибутам чуть быстрее, а добавить новый атрибут нельзя (AttributeError).

  • Выигрыш заметен на миллионах мелких объектов
  • Наследники без своих __slots__ снова получают __dict__
  • Для weakref нужно добавить '__weakref__' в слоты

А ещё @dataclass(slots=True) с Python 3.10 генерирует слоты сам

Подробно

Без слотов каждый экземпляр хранит атрибуты в своём словаре — гибко, но словарь на каждый объект стоит сотни байт.

class Point:
    __slots__ = ("x", "y")
    def __init__(self, x, y):
        self.x, self.y = x, y

p = Point(1, 2)
p.z = 3      # AttributeError

Слоты реализованы дескрипторами на уровне класса: каждый атрибут — ячейка фиксированного смещения в объекте.

Ограничения:

  • нельзя добавлять атрибуты, не перечисленные в слотах;
  • множественное наследование от двух классов с непустыми слотами невозможно;
  • значения по умолчанию через атрибуты класса конфликтуют со слотами;
  • pickle и копирование работают, но старые библиотеки, ожидающие __dict__, могут сломаться.

Когда применять: много мелких объектов (точки, узлы графа, записи из парсера). Для обычных бизнес-объектов выигрыш не нужен.

Что хотят услышать

  • Что заменяют слоты и выигрыш в памяти.
  • Ограничения.
  • dataclass(slots=True).

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✗Ускоряет добавление любых новых атрибутов, а наследники получают __slots__ без __dict__
  • ✓Ячейки вместо __dict__: меньше памяти, новых атрибутов не добавить
  • ✗__slots__ увеличивает память объекта, зато ускоряет доступ к любым атрибутам
  • ✗__slots__ работает только в классах, объявленных через @dataclass(slots=True)

Разбор темы

Связанные вопросы

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования