- Как
__slots__
реализован в Python? - Обнаружено ли это в C-интерфейсе?
- Как мне получить поведение
__slots__
при определении класса Python в C черезPyTypeObject
?
Как реализован __slots__ в Python?
Ответ 1
При создании классов Python они по умолчанию имеют __dict__
, и вы можете установить для них любой атрибут. Точка слотов должна не создавать __dict__
для экономии места.
В интерфейсе C это наоборот, класс расширения по умолчанию не имеет значения __dict__
, и вместо этого вы явно должны добавить его и добавить поддержку getattr/setattr для его обработки (хотя, к счастью, существуют методы для этого уже, PyObject_GenericGetAttr
и PyObject_GenericSetAttr
, поэтому вам не нужно их реализовывать, просто используйте их. (Смешно нет PyObject_GenericDelAttr, хотя я не уверен, что это значит. (Вероятно, я должен остановить скобки вложенности (или нет)))).
Слоты поэтому не нужны и не имеют смысла для типов расширений. По умолчанию вы просто позволяете вашим методам getattr/setatttr получать доступ только к тем атрибутам, которые имеет класс.
Что касается того, как он реализован, код находится в typeobject.c, и это в значительной степени просто вопрос" Если у объекта есть атрибут __slots__
не создавайте __dict__
. Неинтересно.:-)