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