Как __slots__ реализован в Python? - PullRequest
12 голосов
/ 20 февраля 2011
  • Как __slots__ реализовано в Python?
  • Это отображается в интерфейсе C ?
  • Как получить поведение __slots__ при определении класса Python в C с помощью PyTypeObject?

1 Ответ

17 голосов
/ 20 февраля 2011

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

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

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

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

...