Проверяет понимание механизма __slots__ в Python и его влияния на динамическое управление атрибутами экземпляров класса.
В 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__). Используйте его для оптимизации памяти и строгой типизации атрибутов в классах с большим числом экземпляров.