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__. - Использование слотов лишает возможности использовать множественное наследование, если у родителей непустые пересекающиеся слоты.