Что такое slots

Классы хранят поля и их значения в секретном словаре __dict__. Поскольку словарь – изменяемая структура, вы можете на лету добавлять и удалять из класса поля. Параметр __slots__ в классе жестко фиксирует набор полей класса. Слоты используются когда у класса может быть очень много полей, например, в некоторых ORM, либо когда критична производительность, потому что доступ к слоту срабатывает быстрее, чем поиск в словаре, или когда в процессе выполнения программы создаются миллионы экземпляров класса, применение __slots__ позволит сэкономить память.

Слоты активно используются в библиотеках requests и falcon.

Недостатотк: нельзя присвоить классу поле, которого нет в слотах. Не работают методы __getattr__ и __setattr__. Решение: включить в __slots__ элемент __dict__

Oct. 10, 2023, Источник

Это магический метод, который позволяет нам иметь только заданный набор атрибутов в экземпляре класса.

class PointSlots:

    __slots__ = ('x','y') # Перечисляем все возможные атрибуты экземпляров класса
                          
    def __init__(self, x, y):
        self.x = x
        self.y = y

Плюсы

Фиксированность

После указания __slots__ добавление новых атрибутов в экземпляр класса, кроме уже указанных, невозможно

Скорость работы программы

Используемая коллекция для хранения имён переменных в slots позволяет ускорить работу программы

Использование памяти

Уменьшение количества занимаемой памяти при использовании __slots_ связано с тем, что в __slots__ хранятся только значения из пространства имён

Oct. 10, 2023, Источник

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

Когда вы определяете `__slots__` для класса, то определяете фиксированный набор атрибутов, которые могут существовать для экземпляров этого класса. Это позволяет экономить память и улучшать производительность, особенно в случае, когда у вас есть много экземпляров класса.

Пример:

class MyClass:
    __slots__ = ['x', 'y']

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

obj = MyClass(10, 20)
print(obj.x)  # Вывод: 10
print(obj.y)  # Вывод: 20

# Попытка присвоить атрибут, не определенный в __slots__, вызовет ошибку
# obj.z = 30  # Вызовет AttributeError

В этом примере у класса `MyClass` есть определение `__slots__`, которое ограничивает атрибуты экземпляра класса только `x` и `y`. Попытка присвоить значение атрибуту `z` вызовет ошибку AttributeError.

Важно отметить, что использование `__slots__` может иметь смысл только в тех случаях, когда вы уверены, что ограничение набора атрибутов не вызовет проблем в приложении.

Feb. 17, 2024, easyoffer