Подтвердить что ты не робот

Как реализован __slots__ в Python?

  • Как __slots__ реализован в Python?
  • Обнаружено ли это в C-интерфейсе?
  • Как мне получить поведение __slots__ при определении класса Python в C через PyTypeObject?
4b9b3361

Ответ 1

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

В интерфейсе C это наоборот, класс расширения по умолчанию не имеет значения __dict__, и вместо этого вы явно должны добавить его и добавить поддержку getattr/setattr для его обработки (хотя, к счастью, существуют методы для этого уже, PyObject_GenericGetAttr и PyObject_GenericSetAttr, поэтому вам не нужно их реализовывать, просто используйте их. (Смешно нет PyObject_GenericDelAttr, хотя я не уверен, что это значит. (Вероятно, я должен остановить скобки вложенности (или нет)))).

Слоты поэтому не нужны и не имеют смысла для типов расширений. По умолчанию вы просто позволяете вашим методам getattr/setatttr получать доступ только к тем атрибутам, которые имеет класс.

Что касается того, как он реализован, код находится в typeobject.c, и это в значительной степени просто вопрос" Если у объекта есть атрибут __slots__ не создавайте __dict__. Неинтересно.:-)