Как стать автором
Обновить

Комментарии 11

В примерах явно потерялись двойные подчеркивания.

Да, подчёркивания решили не приходить на вечеринку. Но я уже поправил, должны отображаться

а что это за версия питона? Ато у меня AttributeError: 'NoSlots' object has no attribute 'dict'

Подчёркивания не добавились. Поправил, обновите страницу

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

В современном Python 3 это неправда уже лет десять, с момента как стали шарить ключи словарей PEP-412

Сегодня использование слотов не имеет особого практического смысла. Даже если у вас получится выиграть пару лишних мегабайт памяти или миллисекунд на обращение к атрибутам, по отношению к полезной нагрузке от тысяч объектов это будет незначительно.
 
Если у вас полезной нагрузки нет, реально число-дробилка на десятки тысяч объектов и важна производительность, попробуйте “data-driven" подход. Более оптимальные структуры вроде кортежей или условных массивов numpy дадут больше профита, чем "оптимизация" объектов.

Прикол в том, что __slots__ становятся очень интересны при их использовании не по назначению. Мне особенно доставляет их использование в DTO -- это позволяет компактнее сериализировать объекты (см. msgpack)

А как слоты пересекаются с датаклассами?

Пересекаются. Плохо только, что до этого сразу не додумались, а только в 3.10 -- ИМХО очевиднейшая вещь

Ну и под конец важные выводы:

В этом пункте куда-то пропали нижние подчёркивания. Особенно это сбивает с толку когда смотришь на class, а должно быть __class__

Атрибут slots не работает для классов, наследованных, от встроенных типов переменной длины, таких как intbytes и tuple.

Вообще-то пустой __slots__ будет работать:

class A(int): __slots__ = ()

Видимо, при копировании с документации, вы забыли слово Nonempty.

Ну и под конец важные выводы:

Атрибут slots не работает для классов, наследованных, от встроенных типов переменной длины, таких как intbytes и tuple.

Вывод подводит итог того, о чём до этого говорилось. Что-то не найду момента в статье (до вывода), где говорилось бы про наследование класса от встроенных типов переменной длины. Если уж копируете с документации, то так и пишите «Примечания по использованию слотов» («Notes on using slots»)

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации