Что такое _slots_ в Python ?



Ответ



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

По умолчанию классы используют словарь для хранения атрибутов — это позволяет модифицировать набор атрибутов объекта прямо в ходе исполнения программы. Однако такой подход оказывается затратным для объектов, набор атрибутов которых невелик и/или ограничен. Это становится особенно заметно, когда создаётся большое количество экземпляров.



Поведение по умолчанию можно изменить, задав slots при определении класса. В slots могут быть перечислены атрибуты для значений которых требуется зарезервировать место (с точки зрения CPython в объекте класса резервируется место для массива указателей на Python-объекты). При этом ни dict, ни weakref для экземпляров автоматически созданы не будут (даже если в качестве значения строки указать пустую строку).



В качестве значения slots может быть указана строка, объект поддерживающий итерирование, или последовательность строк с именами атрибутов, использующихся экземплярами.



Слоты реализуются при помощи создания дескриптора для каждого из перечисленных атрибутов.



class Ordinary(object):

"""Экземпляры этого класса могут дополняться атрибутами

во время исполнения.



"""





class WithSlots(object):



__slots__ = 'static_attr'





a = Ordinary()

b = WithSlots()



a.__dict__ # {}

b.__dict__ # AttributeError



a.__weakref__ # None

b.__weakref__ # AttributeError



a.static_attr = 1

b.static_attr = 1



a.dynamic_attr = 2

b.dynamic_attr = 2 # AttributeError






Попытки присвоить экземпляру атрибут, который не был перечислен в slots будет поднято исключение AttributeError.

2.3 Если требуется динамическое назначение атрибутов, следует указать в перечислении слотов '__dict__'.



Не имея атрибута weakref, экземпляры классов со slots не поддерживают слабые ссылки на себя.

2.3 Если требуется поддержка слабых ссылок, следует указать в перечислении слотов '__weakref__'.



Область действия слотов ограничено классом, в котором они определены, поэтому наследники (если конечно они не определили собственные слоты) будут иметь dict.



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



Непустой slots не может быть использован для классов, наследующихся от встроенных типов переменной длины, например long, str и кортеж. При попытке сделать это будет поднято исключение TypeError.



Слот может принимать перечисления с «нестроками». Например, могут использоваться отображения, однако в будущих версиях значения по ключам могут быть наделены неким определённым смыслом.



2.6 Если назначается class, следует проследить, что для обоих классов определены одинаковые слоты.



@python_job_interview