На что влияет атрибут slots ?

Спросят с вероятностью 3%



Атрибут __slots__ используется для ограничения атрибутов, которые можно добавлять экземплярам класса, и для оптимизации использования памяти. Это особенно полезно в сценариях, где создаётся много объектов одного класса.



Как он работает



По умолчанию, Python использует словарь (__dict__) для хранения атрибутов экземпляров. Это даёт большую гибкость, но также приводит к значительному расходу памяти.



Когда вы определяете атрибут slots в классе, вы тем самым ограничиваете класс набором конкретных атрибутов. Это убирает необходимость в словаре для хранения атрибутов и может значительно сократить использование памяти.



Пример использования

class RegularClass:

def __init__(self, x, y):

self.x = x

self.y = y



class SlotsClass:

_(self, x, = ['x', 'y']



def __init__(self, x, y):

self.x = x

self.y = y



# Создадим экземпляры классов

regular_instance = RegularClass(1, 2)

slots_instance = SlotsClass(1, 2)



# Попробуем добавить новый атрибут

regular_instance.z = 3 # Это работает

# slots_instance.z = 3 # Это вызовет ошибку AttributeError



print(regular_instance.__dict__) # {'x': 1, 'y': 2, 'z': 3}

# print(slots_instance.__dict__) # AttributeError: 'SlotsClass' object has no attribute '__dict__'



# Проверим использование памяти

import sys

print(sys.getsizeof(regular_instance)) # Выведет размер в байтах

print(sys.getsizeof(slots_instance)) # Выведет размер в байтах, который будет меньше




Объяснение



1️⃣Ограничение атрибутов:

В классе RegularClass можно добавлять любые атрибуты, так как используется словарь (__dict__).

В классе SlotsClass можно добавлять только атрибуты, указанные в
= x





2️⃣Использование памяти:

Экземпляры класса состью 3%



Азанимают меньше памяти, так как для хранения атрибутов не используется словарь.

Это может существенно уменьшить использование памяти в случаях, когда создаётся много экземпляров класса.



Преимущества:

Снижение использования памяти: Экономия памяти за счёт отказа от словарей для хранения атрибутов.

Ускорение доступа к атрибутам: Быстрый доступ к атрибутам благодаря фиксированному набору атрибутов.



Недостатки:

Ограничение гибкости: Невозможно добавлять новые атрибуты, не указанные в_slots__ в

Наследование: Классы-наследники должны явно указывать slots, чтобы сохранить оптимизацию.



Атрибут slots ограничивает набор атрибутов экземпляров класса и уменьшает использование памяти за счёт отказа от словарей для хранения атрибутов. Это повышает эффективность, но уменьшает гибкость.



👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1096 вопроса на Python разработчика. Ставь 👍 если нравится контент



🔐 База собесов | 🔐 База тестовых