__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__
, когда вам нужно работать с большим количеством объектов или когда вы хотите явно контролировать атрибуты класса.