Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Python: __slots__, Python, attribute, instance, memory optimization

Можно ли удалять атрибуты у класса со __slots__? Можно ли добавлять?

Проверяет понимание механизма __slots__ в Python и его влияния на динамическое управление атрибутами экземпляров класса.

Короткий ответ

Нет, удалять атрибуты, объявленные в __slots__, нельзя — это вызовет AttributeError. Добавлять новые атрибуты, не указанные в __slots__, также нельзя, если в классе не определён __dict__. __slots__ фиксирует набор допустимых атрибутов для экономии памяти и ускорения доступа.

Длинный ответ

Что такое __slots__ и зачем он нужен

В Python каждый объект по умолчанию хранит свои атрибуты в словаре __dict__, что даёт гибкость, но расходует память. __slots__ позволяет зафиксировать набор атрибутов экземпляра, заменяя __dict__ на более компактную структуру — массив. Это уменьшает потребление памяти и ускоряет доступ к атрибутам.

Можно ли удалять атрибуты?

Атрибуты, перечисленные в __slots__, нельзя удалить через del obj.attr — это вызовет AttributeError. Например:

class Point:
    __slots__ = ('x', 'y')

p = Point()
p.x = 10
del p.x  # AttributeError: 'x'

Удаление возможно только если атрибут не указан в __slots__, но тогда он хранится в __dict__, что противоречит цели использования __slots__.

Можно ли добавлять новые атрибуты?

Добавление атрибута, не указанного в __slots__, также приведёт к ошибке, если в классе не определён __dict__ (например, если __slots__ не содержит '__dict__'). Пример:

class Point:
    __slots__ = ('x', 'y')

p = Point()
p.z = 5  # AttributeError: 'Point' object has no attribute 'z'

Если нужно разрешить добавление динамических атрибутов, можно включить '__dict__' в __slots__:

class Point:
    __slots__ = ('x', 'y', '__dict__')

p = Point()
p.z = 5  # OK, хранится в __dict__

Однако это снижает экономию памяти.

Практическое применение

__slots__ полезен при создании множества однотипных объектов (например, в играх, научных расчётах). Он также предотвращает случайное добавление новых атрибутов, что может быть удобно для контроля кода.

Вывод: __slots__ фиксирует атрибуты экземпляра, запрещая их удаление и добавление новых (если не включён __dict__). Используйте его для оптимизации памяти и строгой типизации атрибутов в классах с большим числом экземпляров.

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    3

  • Сложность:

    4

Навыки

  • Python

    Python

Ключевые слова

#__slots__

#Python

#attribute

#instance

#memory optimization

Подпишись на Python Developer в телеграм

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.