Логотип YeaHub

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

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

Тренажёр

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

Обучение

Навыки

Задачи

Войти

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

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

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

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

Что происходит со __slots__ при наследовании?

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

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

При наследовании __slots__ не наследуются автоматически. Если дочерний класс не определяет __slots__, он будет иметь __dict__ и может добавлять любые атрибуты. Если дочерний класс определяет __slots__, то он получит только свои слоты плюс слоты родителя, но только если родитель также определил __slots__. Если родитель имеет __dict__ (не использует __slots__), то дочерний класс с __slots__ все равно будет иметь __dict__.

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

Как работают __slots__ при наследовании

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

Основные правила

  • Если родительский класс определяет __slots__, а дочерний — нет, то дочерний класс получит __dict__ и сможет добавлять любые атрибуты, но слоты родителя останутся доступными.
  • Если оба класса определяют __slots__, то дочерний класс будет иметь доступ только к своим слотам и слотам родителя. При этом __dict__ не создается.
  • Если родитель не использует __slots__ (имеет __dict__), то дочерний класс с __slots__ все равно будет иметь __dict__ из-за наследования.

Пример кода

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

class Child(Parent):
    __slots__ = ('z',)

obj = Child()
obj.x = 1  # Работает
obj.z = 2  # Работает
# obj.w = 3  # Ошибка: нет слота 'w'

class ChildWithoutSlots(Parent):
    pass

obj2 = ChildWithoutSlots()
obj2.x = 1  # Работает
obj2.w = 3  # Работает, так как есть __dict__

Вывод

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

  • Аватар

    Python Guru

    Sergey Filichkin

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

Уровень

  • Рейтинг:

    3

  • Сложность:

    5

Навыки

  • Python

    Python

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

#__slots__

#inheritance

#Python

#memory optimization

#attribute access

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

  • Аватар

    Python Guru

    Sergey Filichkin

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