Что такое __slots__
Python
Middle
Без компании
Что такое __slots__
Ответы
`__slots__` — это специальный атрибут класса в Python, который явно определяет фиксированный набор атрибутов (полей) для его экземпляров. Это позволяет значительно оптимизировать память и ускорить доступ к атрибутам.
**Для чего это нужно?**
По умолчанию у каждого объекта Python есть динамический словарь `__dict__`, который хранит все его атрибуты. Это удобно (можно добавлять любые атрибуты на лету), но неэкономно по памяти.
`__slots__` заменяет `__dict__` на фиксированный набор дескрипторов, экономя память и ускоряя доступ.
*Пример 1. Обычный класс (без* `__slots__`*)*
```
class RegularUser:
def __init__(self, name, age):
self.name = name
self.age = age
user1 = RegularUser('Alice', 30)
user1.email = 'alice@mail.com' # Можно добавить новый атрибут
print(user1.__dict__) # {'name': 'Alice', 'age': 30, 'email': 'alice@mail.com'}
```
#### *Пример 2. Класс со* `__slots__`
```
class SlotsUser:
__slots__ = ('name', 'age') # Явно указываем допустимые атрибуты
def __init__(self, name, age):
self.name = name
self.age = age
user2 = SlotsUser('Bob', 25)
# user2.email = 'bob@mail.com' # Вызовет ошибку: AttributeError
print(user2.name) # Работает
```
### **Преимущества** `__slots__`
**- Экономия памяти** (главная причина)
Объекты со `__slots__` не создают словарь `__dict__`, что особенно важно при создании тысяч экземпляров.
**- Более быстрый доступ к атрибутам**
Прямой доступ через дескрипторы работает быстрее, чем поиск в словаре.
**- Защита от опечаток в именах атрибутов**
Если попытаться присвоить значение несуществующему атрибуту, возникнет исключение.