Что такое slots?
1️⃣ Как кратко ответить
__slots__ — это специальный атрибут в Python, который ограничивает создание атрибутов экземпляра класса, экономя память и ускоряя доступ к ним. Он используется для оптимизации производительности, особенно в классах с большим количеством экземпляров.
2️⃣ Подробное объяснение темы
Зачем это нужно
-
Экономия памяти: Каждый экземпляр класса в Python по умолчанию использует словарь
__dict__для хранения своих атрибутов. Это удобно, но неэффективно по памяти, особенно если у вас много экземпляров класса.__slots__позволяет избежать использования__dict__, что значительно снижает потребление памяти. -
Ускорение доступа к атрибутам: Поскольку
__slots__устраняет необходимость в словаре, доступ к атрибутам становится быстрее, так как Python не нужно искать их в__dict__.
Как это работает
Когда вы определяете __slots__ в классе, вы указываете, какие атрибуты могут быть у экземпляров этого класса. Это делается путем присвоения __slots__ списка строк, каждая из которых соответствует имени атрибута.
Пример использования
class Point:
__slots__ = ['x', 'y'] # Определяем, что у экземпляров класса Point могут быть только атрибуты 'x' и 'y'
def __init__(self, x, y):
self.x = x # Устанавливаем значение атрибута 'x'
self.y = y # Устанавливаем значение атрибута 'y'
# Создаем экземпляр класса Point
p = Point(1, 2)
# Доступ к атрибутам 'x' и 'y'
print(p.x) # Вывод: 1
print(p.y) # Вывод: 2
# Попытка добавить новый атрибут вызовет ошибку
# p.z = 3 # AttributeError: 'Point' object has no attribute 'z'
Подробный комментарий к коду
class Point:— определение нового классаPoint.__slots__ = ['x', 'y']— определяет, что экземпляры классаPointмогут иметь только атрибутыxиy. Это устраняет необходимость в__dict__и экономит память.def __init__(self, x, y):— конструктор класса, который принимает два аргументаxиy.self.x = xиself.y = y— инициализация атрибутовxиyдля экземпляра класса.p = Point(1, 2)— создание экземпляра классаPointсx=1иy=2.print(p.x)иprint(p.y)— вывод значений атрибутовxиy.p.z = 3— попытка добавить новый атрибутz, что вызоветAttributeError, так какzне определен в__slots__.
Ограничения
__slots__не поддерживает наследование. Если подкласс также использует__slots__, он должен явно указывать свои слоты.__slots__не позволяет использовать атрибуты, которые не были заранее определены.__slots__не совместим с некоторыми функциями, которые ожидают наличие__dict__, например, с некоторыми библиотеками сериализации.
🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!
Подписаться