__slots__ — это специальный атрибут в Python, который позволяет явно указать, какие атрибуты может иметь экземпляр класса. Он используется для оптимизации памяти и повышения производительности, ограничивая динамическое создание атрибутов.
По умолчанию объекты в Python хранят свои атрибуты в словаре __dict__. Это удобно, так как позволяет динамически добавлять новые атрибуты, но требует дополнительной памяти. __slots__ заменяет __dict__ на фиксированный набор атрибутов, что уменьшает потребление памяти и ускоряет доступ к атрибутам.
class Person:
__slots__ = ['name', 'age'] # Определяем допустимые атрибуты
def __init__(self, name, age):
self.name = name
self.age = age
person = Person("Иван", 30)
print(person.name) # Вывод: Иван
print(person.age) # Вывод: 30
# Попытка добавить новый атрибут
person.address = "Москва" # Ошибка: AttributeError
Здесь:
Person использует __slots__ для ограничения атрибутов только name и age.address вызывает ошибку AttributeError.__slots__ заменяет __dict__ на фиксированный массив, объекты занимают меньше памяти.__slots__ быстрее, чем через __dict__.__slots__ предотвращает случайное создание новых атрибутов, что может быть полезно для повышения надежности кода.import sys
class WithoutSlots:
def __init__(self, name, age):
self.name = name
self.age = age
class WithSlots:
__slots__ = ['name', 'age']
def __init__(self, name, age):
self.name = name
self.age = age
without_slots = WithoutSlots("Иван", 30)
with_slots = WithSlots("Иван", 30)
print(sys.getsizeof(without_slots)) # Вывод: 48 (примерно)
print(sys.getsizeof(with_slots)) # Вывод: 32 (примерно)
Здесь объект с __slots__ занимает меньше памяти, чем объект без него.
__slots__, его нельзя добавить.__slots__, дочерний класс должен также определить __slots__, иначе он будет использовать __dict__.__dict__, что может вызвать проблемы.class Animal:
__slots__ = ['name']
class Dog(Animal):
__slots__ = ['breed'] # Дополнительный слот
dog = Dog()
dog.name = "Бобик"
dog.breed = "Дворняжка"
# Попытка добавить новый атрибут
dog.age = 5 # Ошибка: AttributeError
Здесь:
Dog добавляет новый слот breed, сохраняя слот name от базового класса Animal.age вызывает ошибку, так как он не указан в __slots__.__slots__ поможет значительно сэкономить память.__slots__ — это мощный инструмент для оптимизации памяти и производительности в Python. Он:
__dict__ на фиксированный набор атрибутов.Используйте __slots__, когда вам нужно работать с большим количеством объектов или когда вы хотите явно контролировать атрибуты класса.