Документация Python неофициальный перевод

structures.md

428 строк · 33.2 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.11/c-api/structures.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# Структуры общих объектов89При определении типов объектов Python используется большое количество структур. В данном разделе описываются эти структуры и принципы их использования.1011## Базовые типы объектов и макросы1213Все объекты Python имеют в начале своего представления в памяти небольшое число общих полей. Эти поля описываются типами [`PyObject`](https://python-all.ru/3.11/c-api/structures.html#c.PyObject) и [`PyVarObject`](https://python-all.ru/3.11/c-api/structures.html#c.PyVarObject), которые, в свою очередь, определяются через раскрытие некоторых макросов, используемых (прямо или косвенно) при определении всех остальных объектов Python.1415#### `type PyObject`1617*Часть [Limited API](https://python-all.ru/3.11/c-api/stable.html#stable). (Только некоторые члены являются частью стабильного ABI.)*1819Все типы объектов являются расширениями этого типа. Это тип, который содержит информацию, необходимую Python для обработки указателя на объект как объекта. В обычной «релизной» сборке он содержит только счетчик ссылок объекта и указатель на соответствующий объект типа. Ничто не объявлено как [`PyObject`](https://python-all.ru/3.11/c-api/structures.html#c.PyObject), но любой указатель на объект Python может быть приведен к [PyObject](https://python-all.ru/3.11/c-api/structures.html#c.PyObject)\*. Доступ к членам должен осуществляться с помощью макросов [`Py_REFCNT`](https://python-all.ru/3.11/c-api/structures.html#c.Py_REFCNT) и [`Py_TYPE`](https://python-all.ru/3.11/c-api/structures.html#c.Py_TYPE).2021#### `type PyVarObject`2223*Часть [Limited API](https://python-all.ru/3.11/c-api/stable.html#stable). (Только некоторые члены являются частью стабильного ABI.)*2425Это расширение [`PyObject`](https://python-all.ru/3.11/c-api/structures.html#c.PyObject), добавляющее поле [`ob_size`](https://python-all.ru/3.11/c-api/typeobj.html#c.PyVarObject.ob_size). Он используется только для объектов, которые имеют некоторое понятие *длины*. Этот тип не часто встречается в Python/C API. Доступ к членам должен осуществляться с помощью макросов [`Py_REFCNT`](https://python-all.ru/3.11/c-api/structures.html#c.Py_REFCNT), [`Py_TYPE`](https://python-all.ru/3.11/c-api/structures.html#c.Py_TYPE) и [`Py_SIZE`](https://python-all.ru/3.11/c-api/structures.html#c.Py_SIZE).2627#### `PyObject_HEAD`2829Это макрос, используемый при объявлении новых типов, представляющих объекты без изменяемой длины. Макрос PyObject\_HEAD раскрывается в:3031```c32PyObject ob_base;33```3435См. документацию [`PyObject`](https://python-all.ru/3.11/c-api/structures.html#c.PyObject) выше.3637#### `PyObject_VAR_HEAD`3839Это макрос, используемый при объявлении новых типов, представляющих объекты с длиной, которая меняется от экземпляра к экземпляру. Макрос PyObject\_VAR\_HEAD раскрывается в:4041```c42PyVarObject ob_base;43```4445См. документацию [`PyVarObject`](https://python-all.ru/3.11/c-api/structures.html#c.PyVarObject) выше.4647#### `int Py_Is(PyObject *x, PyObject *y)`4849*Часть [Stable ABI](https://python-all.ru/3.11/c-api/stable.html#stable) начиная с версии 3.10.*5051Проверяет, является ли объект *x* тем же объектом, что и *y*, аналогично `x is y` в Python.5253Новое в версии 3.10.5455#### `int Py_IsNone(PyObject *x)`5657*Часть [Stable ABI](https://python-all.ru/3.11/c-api/stable.html#stable) начиная с версии 3.10.*5859Проверяет, является ли объект синглтоном `None`, аналогично `x is None` в Python.6061Новое в версии 3.10.6263#### `int Py_IsTrue(PyObject *x)`6465*Часть [Stable ABI](https://python-all.ru/3.11/c-api/stable.html#stable) начиная с версии 3.10.*6667Проверяет, является ли объект синглтоном `True`, аналогично `x is True` в Python.6869Новое в версии 3.10.7071#### `int Py_IsFalse(PyObject *x)`7273*Часть [Stable ABI](https://python-all.ru/3.11/c-api/stable.html#stable) начиная с версии 3.10.*7475Проверяет, является ли объект синглтоном `False`, аналогично `x is False` в Python.7677Новое в версии 3.10.7879#### `PyTypeObject *Py_TYPE(PyObject *o)`8081Возвращает тип объекта Python *o*.8283Возвращает [заимствованную ссылку](https://python-all.ru/3.11/glossary.html#term-borrowed-reference).8485Для установки типа объекта используется функция [`Py_SET_TYPE()`](https://python-all.ru/3.11/c-api/structures.html#c.Py_SET_TYPE).8687Изменено в версии 3.11: [`Py_TYPE()`](https://python-all.ru/3.11/c-api/structures.html#c.Py_TYPE) изменён на встроенную статическую функцию. Тип параметра больше не const [PyObject](https://python-all.ru/3.11/c-api/structures.html#c.PyObject)\*.8889#### `int Py_IS_TYPE(PyObject *o, PyTypeObject *type)`9091Возвращает ненулевое значение, если тип объекта *o* равен *type*. В противном случае возвращает нуль. Эквивалентно `Py_TYPE(o) == type`.9293Новое в версии 3.9.9495#### `void Py_SET_TYPE(PyObject *o, PyTypeObject *type)`9697Устанавливает тип объекта *o* в *type*.9899Новое в версии 3.9.100101#### `Py_ssize_t Py_REFCNT(PyObject *o)`102103Возвращает счётчик ссылок объекта Python *o*.104105Используйте функцию [`Py_SET_REFCNT()`](https://python-all.ru/3.11/c-api/structures.html#c.Py_SET_REFCNT) для установки счётчика ссылок объекта.106107Изменено в версии 3.11: Тип параметра больше не const [PyObject](https://python-all.ru/3.11/c-api/structures.html#c.PyObject)\*.108109Изменено в версии 3.10: [`Py_REFCNT()`](https://python-all.ru/3.11/c-api/structures.html#c.Py_REFCNT) изменён на встраиваемую статическую функцию.110111#### `void Py_SET_REFCNT(PyObject *o, Py_ssize_t refcnt)`112113Устанавливает счётчик ссылок объекта *o* в значение *refcnt*.114115Новое в версии 3.9.116117#### `Py_ssize_t Py_SIZE(PyVarObject *o)`118119Возвращает размер объекта Python *o*.120121Для установки размера объекта используется функция [`Py_SET_SIZE()`](https://python-all.ru/3.11/c-api/structures.html#c.Py_SET_SIZE).122123Изменено в версии 3.11: [`Py_SIZE()`](https://python-all.ru/3.11/c-api/structures.html#c.Py_SIZE) изменён на встроенную статическую функцию. Тип параметра больше не const [PyVarObject](https://python-all.ru/3.11/c-api/structures.html#c.PyVarObject)\*.124125#### `void Py_SET_SIZE(PyVarObject *o, Py_ssize_t size)`126127Устанавливает размер объекта *o* в *size*.128129Новое в версии 3.9.130131#### `PyObject_HEAD_INIT(type)`132133Это макрос, который раскрывается в значения инициализации для нового типа [`PyObject`](https://python-all.ru/3.11/c-api/structures.html#c.PyObject). Этот макрос раскрывается в:134135```c136_PyObject_EXTRA_INIT1371, type,138```139140#### `PyVarObject_HEAD_INIT(type, size)`141142Это макрос, который разворачивается в значения инициализации для нового типа [`PyVarObject`](https://python-all.ru/3.11/c-api/structures.html#c.PyVarObject), включая поле [`ob_size`](https://python-all.ru/3.11/c-api/typeobj.html#c.PyVarObject.ob_size). Этот макрос разворачивается в:143144```c145_PyObject_EXTRA_INIT1461, type, size,147```148149## Реализация функций и методов150151#### `type PyCFunction`152153*Часть [Stable ABI](https://python-all.ru/3.11/c-api/stable.html#stable).*154155Тип функций, используемых для реализации большинства вызываемых объектов Python на C. Функции этого типа принимают два параметра [PyObject](https://python-all.ru/3.11/c-api/structures.html#c.PyObject)\* и возвращают одно такое значение. Если возвращаемое значение равно `NULL`, должно быть установлено исключение. Если не `NULL`, возвращаемое значение интерпретируется как возвращаемое значение функции, доступной в Python. Функция должна возвращать новую ссылку.156157Сигнатура функции:158159```c160PyObject *PyCFunction(PyObject *self,161                      PyObject *args);162```163164#### `type PyCFunctionWithKeywords`165166*Часть [Stable ABI](https://python-all.ru/3.11/c-api/stable.html#stable).*167168Тип функций, используемых для реализации вызываемых объектов Python на C с сигнатурой [METH\_VARARGS | METH\_KEYWORDS](https://python-all.ru/3.11/c-api/structures.html#meth-varargs-meth-keywords). Сигнатура функции:169170```c171PyObject *PyCFunctionWithKeywords(PyObject *self,172                                  PyObject *args,173                                  PyObject *kwargs);174```175176#### `type _PyCFunctionFast`177178Тип функций, используемых для реализации вызываемых объектов Python на C с сигнатурой [`METH_FASTCALL`](https://python-all.ru/3.11/c-api/structures.html#c.METH_FASTCALL). Сигнатура функции:179180```c181PyObject *_PyCFunctionFast(PyObject *self,182                           PyObject *const *args,183                           Py_ssize_t nargs);184```185186#### `type _PyCFunctionFastWithKeywords`187188Тип функций, используемых для реализации вызываемых объектов Python на C с сигнатурой [METH\_FASTCALL | METH\_KEYWORDS](https://python-all.ru/3.11/c-api/structures.html#meth-fastcall-meth-keywords). Сигнатура функции:189190```c191PyObject *_PyCFunctionFastWithKeywords(PyObject *self,192                                       PyObject *const *args,193                                       Py_ssize_t nargs,194                                       PyObject *kwnames);195```196197#### `type PyCMethod`198199Тип функций, используемых для реализации вызываемых объектов Python на C с сигнатурой [METH\_METHOD | METH\_FASTCALL | METH\_KEYWORDS](https://python-all.ru/3.11/c-api/structures.html#meth-method-meth-fastcall-meth-keywords). Сигнатура функции:200201```c202PyObject *PyCMethod(PyObject *self,203                    PyTypeObject *defining_class,204                    PyObject *const *args,205                    Py_ssize_t nargs,206                    PyObject *kwnames)207```208209Новое в версии 3.9.210211#### `type PyMethodDef`212213*Часть [Stable ABI](https://python-all.ru/3.11/c-api/stable.html#stable) (включая все члены).*214215Структура, используемая для описания метода типа-расширения. Эта структура имеет четыре поля:216217#### `const char *ml_name`218219Имя метода.220221#### `PyCFunction ml_meth`222223Указатель на реализацию на C.224225#### `int ml_flags`226227Битовые флаги, указывающие, как должен быть построен вызов.228229#### `const char *ml_doc`230231Указывает на содержимое строки документации.232233[`ml_meth`](https://python-all.ru/3.11/c-api/structures.html#c.PyMethodDef.ml_meth) – это указатель на функцию C. Функции могут быть разных tипов, но они всегда возвращают [PyObject](https://python-all.ru/3.11/c-api/structures.html#c.PyObject)\*. Если функция не относится к [`PyCFunction`](https://python-all.ru/3.11/c-api/structures.html#c.PyCFunction), компилятор потребует приведения типов в таблице методов. Хотя [`PyCFunction`](https://python-all.ru/3.11/c-api/structures.html#c.PyCFunction) определяет первый параметр как [PyObject](https://python-all.ru/3.11/c-api/structures.html#c.PyObject)\*, обычно реализация метода использует конкретный тип C объекта *self*.234235Поле [`ml_flags`](https://python-all.ru/3.11/c-api/structures.html#c.PyMethodDef.ml_flags) – это битовое поле, которое может содержать следующие флаги. Отдельные флаги указывают либо соглашение о вызове, либо соглашение о связывании.236237Существуют следующие соглашения о вызове:238239#### `METH_VARARGS`240241Это типичное соглашение о вызове, при котором методы имеют тип [`PyCFunction`](https://python-all.ru/3.11/c-api/structures.html#c.PyCFunction). Функция ожидает два значения [PyObject](https://python-all.ru/3.11/c-api/structures.html#c.PyObject)\*. Первое – это объект *self* для методов; для функций модуля это объект модуля. Второй параметр (часто называемый *args*) – это объект-кортеж, представляющий все аргументы. Этот параметр обычно обрабатывается с помощью [`PyArg_ParseTuple()`](https://python-all.ru/3.11/c-api/arg.html#c.PyArg_ParseTuple) или [`PyArg_UnpackTuple()`](https://python-all.ru/3.11/c-api/arg.html#c.PyArg_UnpackTuple).242243#### `METH_KEYWORDS`244245Может использоваться только в определённых комбинациях с другими флагами: [METH\_VARARGS | METH\_KEYWORDS](https://python-all.ru/3.11/c-api/structures.html#meth-varargs-meth-keywords), [METH\_FASTCALL | METH\_KEYWORDS](https://python-all.ru/3.11/c-api/structures.html#meth-fastcall-meth-keywords) и [METH\_METHOD | METH\_FASTCALL | METH\_KEYWORDS](https://python-all.ru/3.11/c-api/structures.html#meth-method-meth-fastcall-meth-keywords).246247**[METH\_VARARGS](https://python-all.ru/3.11/c-api/structures.html#c.METH_VARARGS) | [METH\_KEYWORDS](https://python-all.ru/3.11/c-api/structures.html#c.METH_KEYWORDS)**248249Методы с этими флагами должны быть типа [`PyCFunctionWithKeywords`](https://python-all.ru/3.11/c-api/structures.html#c.PyCFunctionWithKeywords). Функция ожидает три параметра: *self*, *args*, *kwargs*, где *kwargs* – это словарь всех именованных аргументов или `NULL`, если именованных аргументов нет. Параметры обычно обрабатываются с помощью [`PyArg_ParseTupleAndKeywords()`](https://python-all.ru/3.11/c-api/arg.html#c.PyArg_ParseTupleAndKeywords).250251#### `METH_FASTCALL`252253Быстрое соглашение о вызове, поддерживающее только позиционные аргументы. Методы имеют тип [`_PyCFunctionFast`](https://python-all.ru/3.11/c-api/structures.html#c._PyCFunctionFast). Первый параметр – *self*, второй параметр – массив C из значений [PyObject](https://python-all.ru/3.11/c-api/structures.html#c.PyObject)\*, указывающих аргументы, а третий параметр – количество аргументов (длина массива).254255Добавлено в версии 3.7.256257Изменено в версии 3.10: `METH_FASTCALL` теперь является частью [стабильного ABI](https://python-all.ru/3.11/c-api/stable.html#stable-abi).258259**[METH\_FASTCALL](https://python-all.ru/3.11/c-api/structures.html#c.METH_FASTCALL) | [METH\_KEYWORDS](https://python-all.ru/3.11/c-api/structures.html#c.METH_KEYWORDS)**260261Расширение [`METH_FASTCALL`](https://python-all.ru/3.11/c-api/structures.html#c.METH_FASTCALL), также поддерживающее именованные аргументы, с методами типа [`_PyCFunctionFastWithKeywords`](https://python-all.ru/3.11/c-api/structures.html#c._PyCFunctionFastWithKeywords). Именованные аргументы передаются так же, как в [протоколе vectorcall](https://python-all.ru/3.11/c-api/call.html#vectorcall): добавляется четвёртый параметр [PyObject](https://python-all.ru/3.11/c-api/structures.html#c.PyObject)\*, который является кортежем, представляющим имена именованных аргументов (гарантированно строки) или `NULL`, если ключевых слов нет. Значения именованных аргументов хранятся в массиве *args* после позиционных аргументов.262263Добавлено в версии 3.7.264265#### `METH_METHOD`266267Может использоваться только в комбинации с другими флагами: [METH\_METHOD | METH\_FASTCALL | METH\_KEYWORDS](https://python-all.ru/3.11/c-api/structures.html#meth-method-meth-fastcall-meth-keywords).268269**[METH\_METHOD](https://python-all.ru/3.11/c-api/structures.html#c.METH_METHOD) | [METH\_FASTCALL](https://python-all.ru/3.11/c-api/structures.html#c.METH_FASTCALL) | [METH\_KEYWORDS](https://python-all.ru/3.11/c-api/structures.html#c.METH_KEYWORDS)**270271Расширение [METH\_FASTCALL | METH\_KEYWORDS](https://python-all.ru/3.11/c-api/structures.html#meth-fastcall-meth-keywords), поддерживающее *определяющий класс*, то есть класс, который содержит данный метод. Определяющий класс может быть суперклассом `Py_TYPE(self)`.272273Метод должен быть типа [`PyCMethod`](https://python-all.ru/3.11/c-api/structures.html#c.PyCMethod), как и для `METH_FASTCALL | METH_KEYWORDS` с добавленным аргументом `defining_class` после `self`.274275Новое в версии 3.9.276277#### `METH_NOARGS`278279Методы без параметров не должны проверять, переданы ли аргументы, если они перечислены с флагом [`METH_NOARGS`](https://python-all.ru/3.11/c-api/structures.html#c.METH_NOARGS). Они должны быть типа [`PyCFunction`](https://python-all.ru/3.11/c-api/structures.html#c.PyCFunction). Первый параметр обычно называется *self* и будет содержать ссылку на модуль или экземпляр объекта. Во всех случаях второй параметр будет `NULL`.280281Функция должна иметь 2 параметра. Поскольку второй параметр не используется, [`Py_UNUSED`](https://python-all.ru/3.11/c-api/intro.html#c.Py_UNUSED) можно использовать для предотвращения предупреждения компилятора.282283#### `METH_O`284285Методы с одним объектным аргументом могут быть перечислены с флагом [`METH_O`](https://python-all.ru/3.11/c-api/structures.html#c.METH_O) вместо вызова [`PyArg_ParseTuple()`](https://python-all.ru/3.11/c-api/arg.html#c.PyArg_ParseTuple) с аргументом `"O"`. Они имеют тип [`PyCFunction`](https://python-all.ru/3.11/c-api/structures.html#c.PyCFunction), с параметром *self* и параметром [PyObject](https://python-all.ru/3.11/c-api/structures.html#c.PyObject)\*, представляющим единственный аргумент.286287Эти две константы не используются для указания соглашения о вызовах, а для привязки при использовании с методами классов. Они не могут использоваться для функций, определённых для модулей. Для любого данного метода может быть установлен не более чем один из этих флагов.288289#### `METH_CLASS`290291Метод получит объект типа в качестве первого параметра, а не экземпляр типа. Это используется для создания *методов класса*, аналогично тому, что создаётся при использовании [`classmethod()`](https://python-all.ru/3.11/library/functions.html#classmethod) встроенной функции.292293#### `METH_STATIC`294295Метод получит `NULL` в качестве первого параметра, а не экземпляр типа. Это используется для создания *статических методов*, аналогично тому, что создаётся при использовании встроенной функции [`staticmethod()`](https://python-all.ru/3.11/library/functions.html#staticmethod).296297Ещё одна константа управляет тем, загружается ли метод вместо другого определения с тем же именем метода.298299#### `METH_COEXIST`300301Метод будет загружен вместо существующих определений. Без *METH\_COEXIST* по умолчанию повторяющиеся определения пропускаются. Поскольку обёртки слотов загружаются до таблицы методов, наличие слота *sq\_contains*, например, приведёт к созданию обёрнутого метода с именем [`__contains__()`](https://python-all.ru/3.11/reference/datamodel.html#object.__contains__) и предотвратит загрузку соответствующего PyCFunction с тем же именем. При установленном флаге PyCFunction будет загружен вместо объекта-обёртки и будет сосуществовать со слотом. Это полезно, поскольку вызовы PyCFunctions оптимизированы лучше, чем вызовы объектов-обёрток.302303#### `PyObject *PyCMethod_New(PyMethodDef *ml, PyObject *self, PyObject *module, PyTypeObject *cls)`304305*Возвращаемое значение: новая ссылка.*306307*Часть [Stable ABI](https://python-all.ru/3.11/c-api/stable.html#stable) с версии 3.9.*308309Преобразует *ml* в объект Python [callable](https://python-all.ru/3.11/glossary.html#term-callable). Вызывающий код должен гарантировать, что *ml* переживёт [callable](https://python-all.ru/3.11/glossary.html#term-callable). Обычно *ml* определяется как статическая переменная.310311Параметр *self* будет передан как аргумент *self* в C-функцию из `ml->ml_meth` при вызове. *self* может быть `NULL`.312313Атрибут `__module__` объекта [callable](https://python-all.ru/3.11/glossary.html#term-callable) можно задать из аргумента *module*. *module* должна быть строкой Python, которая будет использоваться как имя модуля, в котором определена функция. Если это недоступно, можно задать [`None`](https://python-all.ru/3.11/library/constants.html#None) или `NULL`.314315> **См. также**316>317> [`function.__module__`](https://python-all.ru/3.11/reference/datamodel.html#function.__module__)318319Параметр *cls* будет передан как аргумент *defining\_class* в C-функцию. Должен быть задан, если [`METH_METHOD`](https://python-all.ru/3.11/c-api/structures.html#c.METH_METHOD) установлен на `ml->ml_flags`.320321Новое в версии 3.9.322323#### `PyObject *PyCFunction_NewEx(PyMethodDef *ml, PyObject *self, PyObject *module)`324325*Возвращаемое значение: новая ссылка.*326327*Часть [Stable ABI](https://python-all.ru/3.11/c-api/stable.html#stable).*328329Эквивалентно `PyCMethod_New(ml, self, module, NULL)`.330331#### `PyObject *PyCFunction_New(PyMethodDef *ml, PyObject *self)`332333*Возвращаемое значение: новая ссылка.*334335*Часть [Stable ABI](https://python-all.ru/3.11/c-api/stable.html#stable) с версии 3.4.*336337Эквивалентно `PyCMethod_New(ml, self, NULL, NULL)`.338339## Доступ к атрибутам типов расширений340341#### `type PyMemberDef`342343*Часть [Stable ABI](https://python-all.ru/3.11/c-api/stable.html#stable) (включая все члены).*344345Структура, описывающая атрибут типа, который соответствует члену C-структуры. Её поля:346347| Поле | Тип C | Значение |348| --- | --- | --- |349| `name` | const char \* | имя члена |350| `type` | int | тип члена в C-структуре |351| `offset` | Py\_ssize\_t | смещение в байтах, по которому член расположен в объектной структуре типа |352| `flags` | int | биты флага, указывающие, должно ли поле быть только для чтения или доступным для записи |353| `doc` | const char \* | указывает на содержимое докстринга |354355`type` может быть одним из многих макросов `T_`, соответствующих различным C типам. При обращении к члену из Python он будет преобразован в эквивалентный тип Python.356357| Имя макроса | Тип C |358| --- | --- |359| T\_SHORT | short |360| T\_INT | int |361| T\_LONG | long |362| T\_FLOAT | float |363| T\_DOUBLE | double |364| T\_STRING | const char \* |365| T\_OBJECT | PyObject \* |366| T\_OBJECT\_EX | PyObject \* |367| T\_CHAR | char |368| T\_BYTE | char |369| T\_UBYTE | unsigned char |370| T\_UINT | unsigned int |371| T\_USHORT | unsigned short |372| T\_ULONG | unsigned long |373| T\_BOOL | char |374| T\_LONGLONG | long long |375| T\_ULONGLONG | unsigned long long |376| T\_PYSSIZET | Py\_ssize\_t |377378`T_OBJECT` и `T_OBJECT_EX` различаются тем, что `T_OBJECT` возвращает `None`, если член равен `NULL`, а `T_OBJECT_EX` возбуждает [`AttributeError`](https://python-all.ru/3.11/library/exceptions.html#AttributeError). Старайтесь использовать `T_OBJECT_EX` вместо `T_OBJECT`, потому что `T_OBJECT_EX` правильнее обрабатывает использование оператора [`del`](https://python-all.ru/3.11/reference/simple_stmts.html#del) для этого атрибута, чем `T_OBJECT`.379380`flags` может быть `0` для доступа на запись и чтение или `READONLY` для доступа только на чтение. Использование `T_STRING` для [`type`](https://python-all.ru/3.11/library/functions.html#type) подразумевает `READONLY`. Данные `T_STRING` интерпретируются как UTF-8. Удалять можно только члены `T_OBJECT` и `T_OBJECT_EX`. (Они устанавливаются в `NULL`).381382Heap allocated types (created using [`PyType_FromSpec()`](https://python-all.ru/3.11/c-api/type.html#c.PyType_FromSpec) or similar), `PyMemberDef` may contain definitions for the special members `__dictoffset__`, `__weaklistoffset__` and `__vectorcalloffset__`, corresponding to [`tp_dictoffset`](https://python-all.ru/3.11/c-api/typeobj.html#c.PyTypeObject.tp_dictoffset), [`tp_weaklistoffset`](https://python-all.ru/3.11/c-api/typeobj.html#c.PyTypeObject.tp_weaklistoffset) and [`tp_vectorcall_offset`](https://python-all.ru/3.11/c-api/typeobj.html#c.PyTypeObject.tp_vectorcall_offset) in type objects. These must be defined with `T_PYSSIZET` and `READONLY`, for example:383384```c385static PyMemberDef spam_type_members[] = {386    {"__dictoffset__", T_PYSSIZET, offsetof(Spam_object, dict), READONLY},387    {NULL}  /* Страж */388};389```390391#### `PyObject *PyMember_GetOne(const char *obj_addr, struct PyMemberDef *m)`392393Получает атрибут, принадлежащий объекту по адресу *obj\_addr*. Атрибут описывается с помощью `PyMemberDef` *m*. Возвращает `NULL` при ошибке.394395#### `int PyMember_SetOne(char *obj_addr, struct PyMemberDef *m, PyObject *o)`396397Устанавливает атрибут, принадлежащий объекту по адресу *obj\_addr*, в значение объекта *o*. Устанавливаемый атрибут описывается с помощью `PyMemberDef` *m*. Возвращает `0` в случае успеха и отрицательное значение при ошибке.398399#### `type PyGetSetDef`400401*Часть [Stable ABI](https://python-all.ru/3.11/c-api/stable.html#stable) (включая все члены).*402403Структура для определения доступа по типу свойства для типа. См. также описание слота [`PyTypeObject.tp_getset`](https://python-all.ru/3.11/c-api/typeobj.html#c.PyTypeObject.tp_getset).404405| Поле | Тип C | Значение |406| --- | --- | --- |407| имя | const char \* | имя атрибута |408| get | getter | C-функция для получения атрибута |409| множество | setter | необязательная C-функция для установки или удаления атрибута, если не указана, атрибут доступен только для чтения |410| doc | const char \* | необязательная строка документации |411| closure | void \* | необязательный указатель на пользовательские данные, предоставляющий дополнительные данные для getter и setter |412413Функция `get` принимает один параметр [PyObject](https://python-all.ru/3.11/c-api/structures.html#c.PyObject)\* (экземпляр) и указатель на пользовательские данные (связанный `closure`):414415```c416typedef PyObject *(*getter)(PyObject *, void *);417```418419В случае успеха должна возвращать новую ссылку или `NULL` с установленным исключением в случае неудачи.420421Функции `set` принимают два параметра [PyObject](https://python-all.ru/3.11/c-api/structures.html#c.PyObject)\* (экземпляр и устанавливаемое значение) и указатель на пользовательские данные (связанный `closure`):422423```c424typedef int (*setter)(PyObject *, PyObject *, void *);425```426427Если атрибут должен быть удален, второй параметр равен `NULL`. В случае успеха должна возвращать `0` или `-1` с установленным исключением в случае неудачи.428