Что такое 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