Skip to content

Slots

Определение#

__slots__ — это специальный атрибут класса, который позволяет явно ограничить набор атрибутов для его экземпляров. Вместо динамического словаря __dict__ Python выделяет фиксированное место в памяти только под указанные поля.

Зачем нужны#

slots используются для оптимизации приложений, создающих миллионы мелких объектов (например, точек в 3D‑графике или записей в БД).

Основная цель — значительная экономия оперативной памяти за счёт отказа от хранения тяжеловесного словаря __dict__ в каждом объекте. Кроме того, доступ к атрибутам через слоты происходит быстрее, так как Python не выполняет поиск по хеш‑таблице словаря.

    class Point:
        # Явно задаем список разрешенных полей
        __slots__ = ('x', 'y')

        def __init__(self, x, y):
            self.x = x
            self.y = y

    p = Point(10, 20)
    print(p.x)  # 10

    # Попытка добавить новое поле вызовет ошибку
    try:
        p.z = 30
    except AttributeError:
        print("Ошибка: нельзя добавлять новые поля!") # Сработает это

Ключевые мысли#

  • __slots__ — это про оптимизацию памяти, а не про «инкапсуляцию» или защиту данных.
  • Если вы наследуетесь от класса со слотами, в дочернем классе тоже нужно прописать __slots__, иначе у него снова появится __dict__.
  • Использование слотов лишает возможности использовать множественное наследование, если у родителей непустые пересекающиеся слоты.