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

typeobj.md

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

1> **Источник:** https://python-all.ru/2.6/c-api/typeobj.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# Объекты типов89Пожалуй, одна из самых важных структур объектной системы Python – это структура, определяющая новый тип: структура [`PyTypeObject`](https://python-all.ru/2.6/c-api/type.html#PyTypeObject). С объектами типов можно работать через любую из функций `PyObject_*()` или `PyType_*()`, но они не представляют большого интереса для большинства приложений Python. Эти объекты лежат в основе поведения объектов, поэтому они очень важны как для самого интерпретатора, так и для любых расширяющих модулей, реализующих новые типы.1011Объекты типа довольно велики по сравнению с большинством стандартных типов. Причина такого размера в том, что каждый объект типа хранит большое количество значений, в основном указателей на функции C, каждый из которых реализует небольшую часть функциональности типа. Поля объекта типа подробно рассматриваются в этом разделе. Поля будут описаны в порядке их появления в структуре.1213Определения типов: unaryfunc, binaryfunc, ternaryfunc, inquiry, coercion, intargfunc, intintargfunc, intobjargproc, intintobjargproc, objobjargproc, destructor, freefunc, printfunc, getattrfunc, getattrofunc, setattrfunc, setattrofunc, cmpfunc, reprfunc, hashfunc1415Определение структуры [`PyTypeObject`](https://python-all.ru/2.6/c-api/type.html#PyTypeObject) можно найти в файле `Include/object.h`. Для удобства здесь повторяется это определение:1617```c18typedef struct _typeobject {19    PyObject_VAR_HEAD20    char *tp_name; /* Для вывода в формате "<module>.<name>" */21    int tp_basicsize, tp_itemsize; /* Для выделения памяти */2223    /* Методы для реализации стандартных операций */2425    destructor tp_dealloc;26    printfunc tp_print;27    getattrfunc tp_getattr;28    setattrfunc tp_setattr;29    cmpfunc tp_compare;30    reprfunc tp_repr;3132    /* Наборы методов для стандартных классов */3334    PyNumberMethods *tp_as_number;35    PySequenceMethods *tp_as_sequence;36    PyMappingMethods *tp_as_mapping;3738    /* Дополнительные стандартные операции (здесь для двоичной совместимости) */3940    hashfunc tp_hash;41    ternaryfunc tp_call;42    reprfunc tp_str;43    getattrofunc tp_getattro;44    setattrofunc tp_setattro;4546    /* Функции для доступа к объекту как к буферу ввода/вывода */47    PyBufferProcs *tp_as_buffer;4849    /* Флаги для определения наличия опциональных/расширенных возможностей */50    long tp_flags;5152    char *tp_doc; /* Строка документации */5354    /* Назначенное значение в версии 2.0 */55    /* вызов функции для всех доступных объектов */56    traverseproc tp_traverse;5758    /* удаление ссылок на содержащиеся объекты */59    inquiry tp_clear;6061    /* Назначенное значение в версии 2.1 */62    /* расширенные сравнения */63    richcmpfunc tp_richcompare;6465    /* включение слабых ссылок */66    long tp_weaklistoffset;6768    /* Добавлено в версии 2.2 */69    /* Итераторы */70    getiterfunc tp_iter;71    iternextfunc tp_iternext;7273    /* Дескриптор атрибутов и механизмы подклассов */74    struct PyMethodDef *tp_methods;75    struct PyMemberDef *tp_members;76    struct PyGetSetDef *tp_getset;77    struct _typeobject *tp_base;78    PyObject *tp_dict;79    descrgetfunc tp_descr_get;80    descrsetfunc tp_descr_set;81    long tp_dictoffset;82    initproc tp_init;83    allocfunc tp_alloc;84    newfunc tp_new;85    freefunc tp_free; /* Низкоуровневая процедура освобождения памяти */86    inquiry tp_is_gc; /* Для PyObject_IS_GC */87    PyObject *tp_bases;88    PyObject *tp_mro; /* порядок разрешения методов */89    PyObject *tp_cache;90    PyObject *tp_subclasses;91    PyObject *tp_weaklist;9293} PyTypeObject;94```9596Структура объекта типа расширяет структуру [`PyVarObject`](https://python-all.ru/2.6/c-api/structures.html#PyVarObject). Поле [`ob_size`](https://python-all.ru/2.6/c-api/typeobj.html#ob_size) используется для динамических типов (создаваемых с помощью `type_new()`, обычно вызываемого из определения класса). Обратите внимание, что [`PyType_Type`](https://python-all.ru/2.6/c-api/type.html#PyType_Type) (метатип) инициализирует [`tp_itemsize`](https://python-all.ru/2.6/c-api/typeobj.html#tp_itemsize), а это означает, что его экземпляры (т.е. объекты типов) *должны* иметь поле [`ob_size`](https://python-all.ru/2.6/c-api/typeobj.html#ob_size).9798**[PyObject](https://python-all.ru/2.6/c-api/structures.html#PyObject)\* [PyObject](https://python-all.ru/2.6/c-api/structures.html#PyObject).`_ob_next`**99100**[PyObject](https://python-all.ru/2.6/c-api/structures.html#PyObject)\* [PyObject](https://python-all.ru/2.6/c-api/structures.html#PyObject).`_ob_prev`**101102These fields are only present when the macro `Py_TRACE_REFS` is defined. Their initialization to *NULL* is taken care of by the `PyObject_HEAD_INIT` macro. For statically allocated objects, these fields always remain *NULL*. For dynamically allocated objects, these two fields are used to link the object into a doubly-linked list of *all* live objects on the heap. This could be used for various debugging purposes; currently the only use is to print the objects that are still alive at the end of a run when the environment variable [**PYTHONDUMPREFS**](https://python-all.ru/2.6/using/cmdline.html#envvar-PYTHONDUMPREFS) is set.103104Эти поля не наследуются подтипами.105106**Py\_ssize\_t [PyObject](https://python-all.ru/2.6/c-api/structures.html#PyObject).`ob_refcnt`**107108Это счётчик ссылок объекта типа, инициализируемый значением `1` макросом `PyObject_HEAD_INIT`. Обратите внимание, что для статически размещённых объектов типа экземпляры типа (объекты, чьё поле [`ob_type`](https://python-all.ru/2.6/c-api/typeobj.html#ob_type) указывает обратно на тип) *не* считаются ссылками. Но для динамически размещённых объектов типа экземпляры *всё же* считаются ссылками.109110Это поле не наследуется подтипами.111112Изменено в версии 2.5: Раньше это поле имело тип `int`. Возможно, потребуется изменить код для корректной поддержки 64-битных систем.113114**[PyTypeObject](https://python-all.ru/2.6/c-api/type.html#PyTypeObject)\* [PyObject](https://python-all.ru/2.6/c-api/structures.html#PyObject).`ob_type`**115116Это тип типа, иными словами, его метатип. Он инициализируется аргументом макроса `PyObject_HEAD_INIT`, и его значением обычно должно быть `&PyType_Type`. Однако для динамически загружаемых модулей расширения, которые должны быть работоспособны в Windows (как минимум), компилятор сообщает, что это недопустимый инициализатор. Поэтому принято передавать *NULL* макросу `PyObject_HEAD_INIT` и инициализировать это поле явно в начале функции инициализации модуля, прежде чем делать что-либо ещё. Обычно это делается так:117118```c119Foo_Type.ob_type = &PyType_Type;120```121122Это должно быть сделано до создания любых экземпляров типа. [`PyType_Ready()`](https://python-all.ru/2.6/c-api/type.html#PyType_Ready) проверяет, является ли [`ob_type`](https://python-all.ru/2.6/c-api/typeobj.html#ob_type) равным *NULL*, и если да, инициализирует его: в Python 2.2 он устанавливается в `&PyType_Type`; в Python 2.2.1 и позднее он инициализируется полем [`ob_type`](https://python-all.ru/2.6/c-api/typeobj.html#ob_type) базового класса. [`PyType_Ready()`](https://python-all.ru/2.6/c-api/type.html#PyType_Ready) не будет изменять это поле, если оно не равно нулю.123124В Python 2.2 это поле не наследуется подтипами. В 2.2.1, а также в 2.3 и более поздних версиях, оно наследуется подтипами.125126**Py\_ssize\_t [PyVarObject](https://python-all.ru/2.6/c-api/structures.html#PyVarObject).`ob_size`**127128Для статически выделенных объектов-типов это поле должно быть инициализировано нулём. Для динамически выделенных объектов-типов это поле имеет особый внутренний смысл.129130Это поле не наследуется подтипами.131132**char\* [PyTypeObject](https://python-all.ru/2.6/c-api/type.html#PyTypeObject).`tp_name`**133134Указатель на строку, завершающуюся NUL, содержащую имя типа. Для типов, доступных как глобальные переменные модуля, строка должна содержать полное имя модуля, за которым следует точка и имя типа; для встроенных типов – только имя типа. Если модуль является подмодулем пакета, полное имя пакета входит в полное имя модуля. Например, тип с именем `T`, определённый в модуле `M` в подпакете `Q` пакета `P`, должен иметь инициализатор [`tp_name`](https://python-all.ru/2.6/c-api/typeobj.html#tp_name) `"P.Q.M.T"`.135136Для динамически выделенных объектов типов это должно быть просто имя типа, а имя модуля должно явно храниться в словаре типа как значение ключа `'__module__'`.137138Для статически размещённых объектов типов поле tp\_name должно содержать точку. Всё, что находится перед последней точкой, становится доступным как атрибут `__module__`, а всё, что после последней точки, – как атрибут `__name__`.139140Если точка отсутствует, всё поле [`tp_name`](https://python-all.ru/2.6/c-api/typeobj.html#tp_name) становится доступным как атрибут `__name__`, а атрибут `__module__` не определён (если только он не задан явно в словаре, как описано выше). Это означает, что ваш тип невозможно будет сериализовать с помощью pickle.141142Это поле не наследуется подтипами.143144**Py\_ssize\_t [PyTypeObject](https://python-all.ru/2.6/c-api/type.html#PyTypeObject).`tp_basicsize`**145146**Py\_ssize\_t [PyTypeObject](https://python-all.ru/2.6/c-api/type.html#PyTypeObject).`tp_itemsize`**147148Эти поля позволяют вычислить размер экземпляров типа в байтах.149150Существует два вида типов: типы с экземплярами фиксированной длины имеют нулевое поле [`tp_itemsize`](https://python-all.ru/2.6/c-api/typeobj.html#tp_itemsize), а типы с экземплярами переменной длины – ненулевое поле [`tp_itemsize`](https://python-all.ru/2.6/c-api/typeobj.html#tp_itemsize). Для типа с экземплярами фиксированной длины все экземпляры имеют одинаковый размер, задаваемый в [`tp_basicsize`](https://python-all.ru/2.6/c-api/typeobj.html#tp_basicsize).151152Для типа с экземплярами переменной длины экземпляры должны иметь поле [`ob_size`](https://python-all.ru/2.6/c-api/typeobj.html#ob_size), а размер экземпляра равен [`tp_basicsize`](https://python-all.ru/2.6/c-api/typeobj.html#tp_basicsize) плюс N умножить на [`tp_itemsize`](https://python-all.ru/2.6/c-api/typeobj.html#tp_itemsize), где N – это «длина» объекта. Значение N обычно хранится в поле [`ob_size`](https://python-all.ru/2.6/c-api/typeobj.html#ob_size) экземпляра. Есть исключения: например, long int используют отрицательное [`ob_size`](https://python-all.ru/2.6/c-api/typeobj.html#ob_size) для обозначения отрицательного числа, и N в этом случае равно `abs(ob_size)`. Кроме того, наличие поля [`ob_size`](https://python-all.ru/2.6/c-api/typeobj.html#ob_size) в структуре экземпляра не означает, что эта структура имеет переменную длину (например, структура для типа списка имеет экземпляры фиксированной длины, но при этом у них есть осмысленное поле [`ob_size`](https://python-all.ru/2.6/c-api/typeobj.html#ob_size)).153154Базовый размер включает поля экземпляра, объявленные макросом [`PyObject_HEAD`](https://python-all.ru/2.6/c-api/structures.html#PyObject_HEAD) или [`PyObject_VAR_HEAD`](https://python-all.ru/2.6/c-api/structures.html#PyObject_VAR_HEAD) (в зависимости от того, какой используется для объявления структуры экземпляра), и он в свою очередь включает поля [`_ob_prev`](https://python-all.ru/2.6/c-api/typeobj.html#_ob_prev) и [`_ob_next`](https://python-all.ru/2.6/c-api/typeobj.html#_ob_next), если они присутствуют. Это означает, что единственный правильный способ получить инициализатор для [`tp_basicsize`](https://python-all.ru/2.6/c-api/typeobj.html#tp_basicsize) – использовать оператор `sizeof` для структуры, используемой для объявления структуры экземпляра. Базовый размер не включает размер заголовка GC (это нововведение в Python 2.2; в версиях 2.1 и 2.0 размер заголовка GC включался в [`tp_basicsize`](https://python-all.ru/2.6/c-api/typeobj.html#tp_basicsize)).155156Эти поля наследуются подтипами отдельно. Если базовый тип имеет ненулевое [`tp_itemsize`](https://python-all.ru/2.6/c-api/typeobj.html#tp_itemsize), то, как правило, небезопасно устанавливать [`tp_itemsize`](https://python-all.ru/2.6/c-api/typeobj.html#tp_itemsize) в другое ненулевое значение в подтипе (хотя это зависит от реализации базового типа).157158Замечание о выравнивании: если элементы переменной длины требуют определённого выравнивания, это должно обеспечиваться значением [`tp_basicsize`](https://python-all.ru/2.6/c-api/typeobj.html#tp_basicsize). Пример: предположим, тип реализует массив из `double`. [`tp_itemsize`](https://python-all.ru/2.6/c-api/typeobj.html#tp_itemsize) равно `sizeof(double)`. Ответственность программиста – сделать так, чтобы [`tp_basicsize`](https://python-all.ru/2.6/c-api/typeobj.html#tp_basicsize) было кратно `sizeof(double)` (предполагая, что это требование выравнивания для `double`).159160**destructor [PyTypeObject](https://python-all.ru/2.6/c-api/type.html#PyTypeObject).`tp_dealloc`**161162Указатель на функцию-деструктор экземпляра. Эта функция должна быть определена, если только тип не гарантирует, что его экземпляры никогда не будут освобождены (как в случае с синглтонами `None` и `Ellipsis`).163164Функция-деструктор вызывается макросами [`Py_DECREF()`](https://python-all.ru/2.6/c-api/refcounting.html#Py_DECREF) и [`Py_XDECREF()`](https://python-all.ru/2.6/c-api/refcounting.html#Py_XDECREF), когда счётчик ссылок становится нулевым. В этот момент экземпляр всё ещё существует, но на него нет ссылок. Функция-деструктор должна освободить все ссылки, которыми владеет экземпляр, освободить все буферы памяти, принадлежащие экземпляру (с помощью функции освобождения, соответствующей функции выделения, использованной для выделения буфера), и наконец (последним действием) вызвать функцию [`tp_free`](https://python-all.ru/2.6/c-api/typeobj.html#tp_free) типа. Если тип не является субтипируемым (не имеет установленного флага [`Py_TPFLAGS_BASETYPE`](https://python-all.ru/2.6/c-api/typeobj.html#Py_TPFLAGS_BASETYPE)), можно вызвать освободитель объекта напрямую, а не через [`tp_free`](https://python-all.ru/2.6/c-api/typeobj.html#tp_free). Освободитель объекта должен быть тем же, который использовался для выделения экземпляра; обычно это [`PyObject_Del()`](https://python-all.ru/2.6/c-api/allocation.html#PyObject_Del), если экземпляр был выделен с помощью [`PyObject_New()`](https://python-all.ru/2.6/c-api/allocation.html#PyObject_New) или `PyObject_VarNew()`, или [`PyObject_GC_Del()`](https://python-all.ru/2.6/c-api/gcsupport.html#PyObject_GC_Del), если экземпляр был выделен с помощью [`PyObject_GC_New()`](https://python-all.ru/2.6/c-api/gcsupport.html#PyObject_GC_New) или [`PyObject_GC_NewVar()`](https://python-all.ru/2.6/c-api/gcsupport.html#PyObject_GC_NewVar).165166Это поле наследуется подтипами.167168**printfunc [PyTypeObject](https://python-all.ru/2.6/c-api/type.html#PyTypeObject).`tp_print`**169170Необязательный указатель на функцию печати экземпляра.171172Функция печати вызывается только тогда, когда экземпляр выводится в *настоящий* файл; при выводе в псевдо-файл (например, в экземпляр `StringIO`), для преобразования в строку вызывается функция [`tp_repr`](https://python-all.ru/2.6/c-api/typeobj.html#tp_repr) или [`tp_str`](https://python-all.ru/2.6/c-api/typeobj.html#tp_str) экземпляра. Они также вызываются, когда поле [`tp_print`](https://python-all.ru/2.6/c-api/typeobj.html#tp_print) типа равно *NULL*. Тип ни в коем случае не должен реализовывать [`tp_print`](https://python-all.ru/2.6/c-api/typeobj.html#tp_print) так, чтобы его вывод отличался от вывода [`tp_repr`](https://python-all.ru/2.6/c-api/typeobj.html#tp_repr) или [`tp_str`](https://python-all.ru/2.6/c-api/typeobj.html#tp_str).173174Функция печати вызывается с той же сигнатурой, что и [`PyObject_Print()`](https://python-all.ru/2.6/c-api/object.html#PyObject_Print): `int tp_print(PyObject *self, FILE *file, int flags)`. Аргумент *self* – это выводимый экземпляр. Аргумент *file* – это файл stdio, в который производится вывод. Аргумент *flags* состоит из битовых флагов. Единственный определённый в настоящее время битовый флаг – `Py_PRINT_RAW`. Когда бит `Py_PRINT_RAW` установлен, экземпляр должен выводиться так же, как его отформатировала бы функция [`tp_str`](https://python-all.ru/2.6/c-api/typeobj.html#tp_str); когда бит `Py_PRINT_RAW` сброшен, экземпляр должен выводиться так же, как его отформатировала бы функция [`tp_repr`](https://python-all.ru/2.6/c-api/typeobj.html#tp_repr). Функция должна возвращать `-1` и устанавливать условие исключения, если во время сравнения произошла ошибка.175176Возможно, поле [`tp_print`](https://python-all.ru/2.6/c-api/typeobj.html#tp_print) будет объявлено устаревшим. В любом случае рекомендуется не определять [`tp_print`](https://python-all.ru/2.6/c-api/typeobj.html#tp_print), а вместо этого полагаться на [`tp_repr`](https://python-all.ru/2.6/c-api/typeobj.html#tp_repr) и [`tp_str`](https://python-all.ru/2.6/c-api/typeobj.html#tp_str) для вывода.177178Это поле наследуется подтипами.179180**getattrfunc [PyTypeObject](https://python-all.ru/2.6/c-api/type.html#PyTypeObject).`tp_getattr`**181182Необязательный указатель на функцию получения строки атрибута.183184Это поле устарело. Если оно определено, оно должно указывать на функцию, которая действует так же, как функция [`tp_getattro`](https://python-all.ru/2.6/c-api/typeobj.html#tp_getattro), но принимает C-строку вместо строкового объекта Python для указания имени атрибута. Сигнатура такая же, как у [`PyObject_GetAttrString()`](https://python-all.ru/2.6/c-api/object.html#PyObject_GetAttrString).185186Это поле наследуется подтипами вместе с [`tp_getattro`](https://python-all.ru/2.6/c-api/typeobj.html#tp_getattro): подтип наследует и [`tp_getattr`](https://python-all.ru/2.6/c-api/typeobj.html#tp_getattr), и [`tp_getattro`](https://python-all.ru/2.6/c-api/typeobj.html#tp_getattro) от своего базового типа, когда [`tp_getattr`](https://python-all.ru/2.6/c-api/typeobj.html#tp_getattr) и [`tp_getattro`](https://python-all.ru/2.6/c-api/typeobj.html#tp_getattro) подтипа оба равны *NULL*.187188**setattrfunc [PyTypeObject](https://python-all.ru/2.6/c-api/type.html#PyTypeObject).`tp_setattr`**189190Необязательный указатель на функцию установки строкового атрибута.191192Это поле устарело. Если оно определено, оно должно указывать на функцию, которая ведет себя так же, как [`tp_setattro`](https://python-all.ru/2.6/c-api/typeobj.html#tp_setattro), но принимает строку C вместо строкового объекта Python для указания имени атрибута. Сигнатура такая же, как у [`PyObject_SetAttrString()`](https://python-all.ru/2.6/c-api/object.html#PyObject_SetAttrString).193194Это поле наследуется подтипами вместе с [`tp_setattro`](https://python-all.ru/2.6/c-api/typeobj.html#tp_setattro): подтип наследует как [`tp_setattr`](https://python-all.ru/2.6/c-api/typeobj.html#tp_setattr), так и [`tp_setattro`](https://python-all.ru/2.6/c-api/typeobj.html#tp_setattro) от своего базового типа, когда [`tp_setattr`](https://python-all.ru/2.6/c-api/typeobj.html#tp_setattr) и [`tp_setattro`](https://python-all.ru/2.6/c-api/typeobj.html#tp_setattro) подтипа равны *NULL*.195196**cmpfunc [PyTypeObject](https://python-all.ru/2.6/c-api/type.html#PyTypeObject).`tp_compare`**197198Необязательный указатель на функцию тройного сравнения.199200Сигнатура такая же, как у [`PyObject_Compare()`](https://python-all.ru/2.6/c-api/object.html#PyObject_Compare). Функция должна возвращать `1`, если *self* больше *other*, `0`, если *self* равно *other*, и `-1`, если *self* меньше *other*. Она должна возвращать `-1` и установить условие исключения при возникновении ошибки во время сравнения.201202Это поле наследуется подтипами вместе с [`tp_richcompare`](https://python-all.ru/2.6/c-api/typeobj.html#tp_richcompare) и [`tp_hash`](https://python-all.ru/2.6/c-api/typeobj.html#tp_hash): подтип наследует все три поля [`tp_compare`](https://python-all.ru/2.6/c-api/typeobj.html#tp_compare), [`tp_richcompare`](https://python-all.ru/2.6/c-api/typeobj.html#tp_richcompare) и [`tp_hash`](https://python-all.ru/2.6/c-api/typeobj.html#tp_hash), когда [`tp_compare`](https://python-all.ru/2.6/c-api/typeobj.html#tp_compare), [`tp_richcompare`](https://python-all.ru/2.6/c-api/typeobj.html#tp_richcompare) и [`tp_hash`](https://python-all.ru/2.6/c-api/typeobj.html#tp_hash) подтипа равны *NULL*.203204**reprfunc [PyTypeObject](https://python-all.ru/2.6/c-api/type.html#PyTypeObject).`tp_repr`**205206Необязательный указатель на функцию, реализующую встроенную функцию [`repr()`](https://python-all.ru/2.6/library/functions.html#repr).207208Сигнатура такая же, как у [`PyObject_Repr()`](https://python-all.ru/2.6/c-api/object.html#PyObject_Repr); она должна возвращать строку или объект Unicode. В идеале эта функция должна возвращать строку, которая при передаче в [`eval()`](https://python-all.ru/2.6/library/functions.html#eval) в подходящем окружении возвращает объект с тем же значением. Если это невозможно, она должна возвращать строку, начинающуюся с `'<'` и заканчивающуюся `'>'`, по которой можно определить как тип, так и значение объекта.209210Если это поле не задано, возвращается строка вида `<%s object at %p>`, где `%s` заменяется на имя типа, а `%p` – на адрес памяти объекта.211212Это поле наследуется подтипами.213214**[PyNumberMethods](https://python-all.ru/2.6/c-api/typeobj.html#PyNumberMethods)\* `tp_as_number`**215216Указатель на дополнительную структуру, содержащую поля, значимые только для объектов, реализующих числовой протокол. Эти поля описаны в [*Структуры числовых объектов*](https://python-all.ru/2.6/c-api/typeobj.html#number-structs).217218Поле [`tp_as_number`](https://python-all.ru/2.6/c-api/typeobj.html#tp_as_number) не наследуется, но содержащиеся в нём поля наследуются по отдельности.219220**[PySequenceMethods](https://python-all.ru/2.6/c-api/typeobj.html#PySequenceMethods)\* `tp_as_sequence`**221222Указатель на дополнительную структуру, содержащую поля, значимые только для объектов, реализующих протокол последовательности. Эти поля описаны в [*Структуры объектов-последовательностей*](https://python-all.ru/2.6/c-api/typeobj.html#sequence-structs).223224Поле [`tp_as_sequence`](https://python-all.ru/2.6/c-api/typeobj.html#tp_as_sequence) не наследуется, но содержащиеся в нём поля наследуются по отдельности.225226**[PyMappingMethods](https://python-all.ru/2.6/c-api/typeobj.html#PyMappingMethods)\* `tp_as_mapping`**227228Указатель на дополнительную структуру, содержащую поля, значимые только для объектов, реализующих протокол отображения. Эти поля описаны в [*Структуры объектов-отображений*](https://python-all.ru/2.6/c-api/typeobj.html#mapping-structs).229230Поле [`tp_as_mapping`](https://python-all.ru/2.6/c-api/typeobj.html#tp_as_mapping) не наследуется, но содержащиеся в нём поля наследуются по отдельности.231232**hashfunc [PyTypeObject](https://python-all.ru/2.6/c-api/type.html#PyTypeObject).`tp_hash`**233234Необязательный указатель на функцию, реализующую встроенную функцию [`hash()`](https://python-all.ru/2.6/library/functions.html#hash).235236Сигнатура та же, что и для [`PyObject_Hash()`](https://python-all.ru/2.6/c-api/object.html#PyObject_Hash); она должна возвращать C long. Значение `-1` не должно возвращаться в качестве обычного возвращаемого значения; при возникновении ошибки во время вычисления хеш-значения функция должна установить исключение и вернуть `-1`.237238Это поле может быть явно установлено в [`PyObject_HashNotImplemented()`](https://python-all.ru/2.6/c-api/object.html#PyObject_HashNotImplemented) для блокировки наследования метода хеширования от родительского типа. Это интерпретируется как эквивалент `__hash__ = None` на уровне Python, в результате чего `isinstance(o, collections.Hashable)` корректно возвращает `False`. Обратите внимание, что верно и обратное: установка `__hash__ = None` в классе на уровне Python приведет к тому, что слот `tp_hash` будет установлен в [`PyObject_HashNotImplemented()`](https://python-all.ru/2.6/c-api/object.html#PyObject_HashNotImplemented).239240Когда это поле не задано, возможны два варианта: если поля [`tp_compare`](https://python-all.ru/2.6/c-api/typeobj.html#tp_compare) и [`tp_richcompare`](https://python-all.ru/2.6/c-api/typeobj.html#tp_richcompare) оба равны *NULL*, возвращается значение хеша по умолчанию, основанное на адресе объекта; в противном случае возбуждается [`TypeError`](https://python-all.ru/2.6/library/exceptions.html#exceptions.TypeError).241242Это поле наследуется подтипами вместе с [`tp_richcompare`](https://python-all.ru/2.6/c-api/typeobj.html#tp_richcompare) и [`tp_compare`](https://python-all.ru/2.6/c-api/typeobj.html#tp_compare): подтип наследует все три поля [`tp_compare`](https://python-all.ru/2.6/c-api/typeobj.html#tp_compare), [`tp_richcompare`](https://python-all.ru/2.6/c-api/typeobj.html#tp_richcompare) и [`tp_hash`](https://python-all.ru/2.6/c-api/typeobj.html#tp_hash), когда [`tp_compare`](https://python-all.ru/2.6/c-api/typeobj.html#tp_compare), [`tp_richcompare`](https://python-all.ru/2.6/c-api/typeobj.html#tp_richcompare) и [`tp_hash`](https://python-all.ru/2.6/c-api/typeobj.html#tp_hash) подтипа равны *NULL*.243244**ternaryfunc [PyTypeObject](https://python-all.ru/2.6/c-api/type.html#PyTypeObject).`tp_call`**245246Необязательный указатель на функцию, реализующую вызов объекта. Он должен быть *NULL*, если объект не является вызываемым. Сигнатура такая же, как у [`PyObject_Call()`](https://python-all.ru/2.6/c-api/object.html#PyObject_Call).247248Это поле наследуется подтипами.249250**reprfunc [PyTypeObject](https://python-all.ru/2.6/c-api/type.html#PyTypeObject).`tp_str`**251252Необязательный указатель на функцию, реализующую встроенную операцию [`str()`](https://python-all.ru/2.6/library/functions.html#str). (Обратите внимание, что [`str`](https://python-all.ru/2.6/library/functions.html#str) теперь является типом, и [`str()`](https://python-all.ru/2.6/library/functions.html#str) вызывает конструктор этого типа. Этот конструктор вызывает [`PyObject_Str()`](https://python-all.ru/2.6/c-api/object.html#PyObject_Str) для выполнения фактической работы, а [`PyObject_Str()`](https://python-all.ru/2.6/c-api/object.html#PyObject_Str) вызовет этот обработчик.)253254Сигнатура такая же, как у [`PyObject_Str()`](https://python-all.ru/2.6/c-api/object.html#PyObject_Str); функция должна возвращать строку или объект Unicode. Эта функция должна возвращать «дружественное» строковое представление объекта, так как именно это представление будет использоваться оператором print.255256Если это поле не установлено, вызывается [`PyObject_Repr()`](https://python-all.ru/2.6/c-api/object.html#PyObject_Repr) для возврата строкового представления.257258Это поле наследуется подтипами.259260**getattrofunc [PyTypeObject](https://python-all.ru/2.6/c-api/type.html#PyTypeObject).`tp_getattro`**261262Необязательный указатель на функцию получения атрибута.263264Сигнатура такая же, как у [`PyObject_GetAttr()`](https://python-all.ru/2.6/c-api/object.html#PyObject_GetAttr). Обычно удобно устанавливать это поле в [`PyObject_GenericGetAttr()`](https://python-all.ru/2.6/c-api/object.html#PyObject_GenericGetAttr), который реализует обычный способ поиска атрибутов объекта.265266Это поле наследуется подтипами вместе с [`tp_getattr`](https://python-all.ru/2.6/c-api/typeobj.html#tp_getattr): подтип наследует как [`tp_getattr`](https://python-all.ru/2.6/c-api/typeobj.html#tp_getattr), так и [`tp_getattro`](https://python-all.ru/2.6/c-api/typeobj.html#tp_getattro) от своего базового типа, когда [`tp_getattr`](https://python-all.ru/2.6/c-api/typeobj.html#tp_getattr) и [`tp_getattro`](https://python-all.ru/2.6/c-api/typeobj.html#tp_getattro) подтипа равны *NULL*.267268**setattrofunc [PyTypeObject](https://python-all.ru/2.6/c-api/type.html#PyTypeObject).`tp_setattro`**269270Необязательный указатель на функцию установки атрибута.271272Сигнатура такая же, как у [`PyObject_SetAttr()`](https://python-all.ru/2.6/c-api/object.html#PyObject_SetAttr). Обычно удобно устанавливать это поле в [`PyObject_GenericSetAttr()`](https://python-all.ru/2.6/c-api/object.html#PyObject_GenericSetAttr), которая реализует обычный способ установки атрибутов объекта.273274Это поле наследуется подтипами вместе с [`tp_setattr`](https://python-all.ru/2.6/c-api/typeobj.html#tp_setattr): подтип наследует как [`tp_setattr`](https://python-all.ru/2.6/c-api/typeobj.html#tp_setattr), так и [`tp_setattro`](https://python-all.ru/2.6/c-api/typeobj.html#tp_setattro) от базового типа, когда собственные поля [`tp_setattr`](https://python-all.ru/2.6/c-api/typeobj.html#tp_setattr) и [`tp_setattro`](https://python-all.ru/2.6/c-api/typeobj.html#tp_setattro) подтипа оба равны *NULL*.275276**[PyBufferProcs](https://python-all.ru/2.6/c-api/typeobj.html#PyBufferProcs)\* [PyTypeObject](https://python-all.ru/2.6/c-api/type.html#PyTypeObject).`tp_as_buffer`**277278Указатель на дополнительную структуру, содержащую поля, значимые только для объектов, реализующих буферный интерфейс. Эти поля описаны в [*Buffer Object Structures*](https://python-all.ru/2.6/c-api/typeobj.html#buffer-structs).279280Поле [`tp_as_buffer`](https://python-all.ru/2.6/c-api/typeobj.html#tp_as_buffer) не наследуется, но содержащиеся в нём поля наследуются по отдельности.281282**long [PyTypeObject](https://python-all.ru/2.6/c-api/type.html#PyTypeObject).`tp_flags`**283284Это поле представляет собой битовую маску различных флагов. Некоторые флаги указывают на варианты семантики в определённых ситуациях; другие используются для обозначения того, что определённые поля в объекте типа (или в структурах расширения, на которые ссылаются [`tp_as_number`](https://python-all.ru/2.6/c-api/typeobj.html#tp_as_number), [`tp_as_sequence`](https://python-all.ru/2.6/c-api/typeobj.html#tp_as_sequence), [`tp_as_mapping`](https://python-all.ru/2.6/c-api/typeobj.html#tp_as_mapping) и [`tp_as_buffer`](https://python-all.ru/2.6/c-api/typeobj.html#tp_as_buffer)), которые исторически не всегда присутствовали, являются допустимыми; если такой бит флага сброшен, то поля типа, которые он защищает, не должны быть доступны и должны считаться имеющими нулевое значение или *NULL*.285286Наследование этого поля устроено сложно. Большинство битов флагов наследуются индивидуально, т.е. если у базового типа установлен бит флага, подтип наследует этот бит. Биты флагов, относящиеся к структурам расширения, наследуются строго в том случае, если наследуется сама структура расширения: значение бита флага базового типа копируется в подтип вместе с указателем на структуру расширения. Бит флага [`Py_TPFLAGS_HAVE_GC`](https://python-all.ru/2.6/c-api/typeobj.html#Py_TPFLAGS_HAVE_GC) наследуется вместе с полями [`tp_traverse`](https://python-all.ru/2.6/c-api/typeobj.html#tp_traverse) и [`tp_clear`](https://python-all.ru/2.6/c-api/typeobj.html#tp_clear), т.е. если в подтипе [`Py_TPFLAGS_HAVE_GC`](https://python-all.ru/2.6/c-api/typeobj.html#Py_TPFLAGS_HAVE_GC) сброшен, а поля [`tp_traverse`](https://python-all.ru/2.6/c-api/typeobj.html#tp_traverse) и [`tp_clear`](https://python-all.ru/2.6/c-api/typeobj.html#tp_clear) в подтипе существуют (как показывает бит флага [`Py_TPFLAGS_HAVE_RICHCOMPARE`](https://python-all.ru/2.6/c-api/typeobj.html#Py_TPFLAGS_HAVE_RICHCOMPARE)) и имеют значения *NULL*.287288В настоящее время определены следующие битовые маски; их можно объединить с помощью оператора `|`, чтобы сформировать значение поля [`tp_flags`](https://python-all.ru/2.6/c-api/typeobj.html#tp_flags). Макрос [`PyType_HasFeature()`](https://python-all.ru/2.6/c-api/type.html#PyType_HasFeature) принимает тип и значение флагов, *tp* и *f*, и проверяет, является ли `tp->tp_flags & f` ненулевым.289290#### `Py_TPFLAGS_HAVE_GETCHARBUFFER`291292Если этот бит установлен, структура293294[`PyBufferProcs`](https://python-all.ru/2.6/c-api/typeobj.html#PyBufferProcs)295296, на которую ссылается297298[`tp_as_buffer`](https://python-all.ru/2.6/c-api/typeobj.html#tp_as_buffer)299300, содержит поле301302`bf_getcharbuffer`303304.305306#### `Py_TPFLAGS_HAVE_SEQUENCE_IN`307308Если этот бит установлен, структура309310[`PySequenceMethods`](https://python-all.ru/2.6/c-api/typeobj.html#PySequenceMethods)311312, на которую ссылается313314[`tp_as_sequence`](https://python-all.ru/2.6/c-api/typeobj.html#tp_as_sequence)315316, содержит поле317318[`sq_contains`](https://python-all.ru/2.6/c-api/typeobj.html#sq_contains)319320.321322#### `Py_TPFLAGS_GC`323324Этот бит устарел. Бит, который он обозначал, больше не используется. Символ теперь определяется как ноль.325326#### `Py_TPFLAGS_HAVE_INPLACEOPS`327328Если этот бит установлен, структура329330[`PySequenceMethods`](https://python-all.ru/2.6/c-api/typeobj.html#PySequenceMethods)331332, на которую ссылается333334[`tp_as_sequence`](https://python-all.ru/2.6/c-api/typeobj.html#tp_as_sequence)335336, и структура337338[`PyNumberMethods`](https://python-all.ru/2.6/c-api/typeobj.html#PyNumberMethods)339340, на которую ссылается341342[`tp_as_number`](https://python-all.ru/2.6/c-api/typeobj.html#tp_as_number)343344, содержат поля для операций in-place. В частности, это означает, что структура345346[`PyNumberMethods`](https://python-all.ru/2.6/c-api/typeobj.html#PyNumberMethods)347348содержит поля349350`nb_inplace_add`351352,353354`nb_inplace_subtract`355356,357358`nb_inplace_multiply`359360,361362`nb_inplace_divide`363364,365366`nb_inplace_remainder`367368,369370`nb_inplace_power`371372,373374`nb_inplace_lshift`375376,377378`nb_inplace_rshift`379380,381382`nb_inplace_and`383384,385386`nb_inplace_xor`387388и389390`nb_inplace_or`391392; а структура393394[`PySequenceMethods`](https://python-all.ru/2.6/c-api/typeobj.html#PySequenceMethods)395396содержит поля397398[`sq_inplace_concat`](https://python-all.ru/2.6/c-api/typeobj.html#sq_inplace_concat)399400и401402[`sq_inplace_repeat`](https://python-all.ru/2.6/c-api/typeobj.html#sq_inplace_repeat)403404.405406#### `Py_TPFLAGS_CHECKTYPES`407408Если этот бит установлен, бинарные и тернарные операции в структуре409410[`PyNumberMethods`](https://python-all.ru/2.6/c-api/typeobj.html#PyNumberMethods)411412, на которую ссылается413414[`tp_as_number`](https://python-all.ru/2.6/c-api/typeobj.html#tp_as_number)415416, принимают аргументы произвольных типов объектов и при необходимости выполняют собственное преобразование типов. Если этот бит сброшен, такие операции требуют, чтобы все аргументы имели текущий тип, а вызывающий код должен сначала выполнить операцию приведения (coercion). Это относится к417418`nb_add`419420,421422`nb_subtract`423424,425426`nb_multiply`427428,429430`nb_divide`431432,433434`nb_remainder`435436,437438`nb_divmod`439440,441442`nb_power`443444,445446`nb_lshift`447448,449450`nb_rshift`451452,453454`nb_and`455456,457458`nb_xor`459460и461462`nb_or`463464.465466#### `Py_TPFLAGS_HAVE_RICHCOMPARE`467468Если этот бит установлен, объект типа содержит поле469470[`tp_richcompare`](https://python-all.ru/2.6/c-api/typeobj.html#tp_richcompare)471472, а также поля473474[`tp_traverse`](https://python-all.ru/2.6/c-api/typeobj.html#tp_traverse)475476и477478[`tp_clear`](https://python-all.ru/2.6/c-api/typeobj.html#tp_clear)479480.481482#### `Py_TPFLAGS_HAVE_WEAKREFS`483484Если этот бит установлен, определено поле485486[`tp_weaklistoffset`](https://python-all.ru/2.6/c-api/typeobj.html#tp_weaklistoffset)487488. Экземпляры типа поддерживают слабые ссылки, если значение поля489490[`tp_weaklistoffset`](https://python-all.ru/2.6/c-api/typeobj.html#tp_weaklistoffset)491492этого типа больше нуля.493494#### `Py_TPFLAGS_HAVE_ITER`495496Если этот бит установлен, объект типа содержит поля497498[`tp_iter`](https://python-all.ru/2.6/c-api/typeobj.html#tp_iter)499500и501502[`tp_iternext`](https://python-all.ru/2.6/c-api/typeobj.html#tp_iternext)503504.505506#### `Py_TPFLAGS_HAVE_CLASS`507508Если этот бит установлен, объект типа содержит несколько новых полей, определенных начиная с Python 2.2:509510[`tp_methods`](https://python-all.ru/2.6/c-api/typeobj.html#tp_methods)511512,513514[`tp_members`](https://python-all.ru/2.6/c-api/typeobj.html#tp_members)515516,517518[`tp_getset`](https://python-all.ru/2.6/c-api/typeobj.html#tp_getset)519520,521522[`tp_base`](https://python-all.ru/2.6/c-api/typeobj.html#tp_base)523524,525526[`tp_dict`](https://python-all.ru/2.6/c-api/typeobj.html#tp_dict)527528,529530[`tp_descr_get`](https://python-all.ru/2.6/c-api/typeobj.html#tp_descr_get)531532,533534[`tp_descr_set`](https://python-all.ru/2.6/c-api/typeobj.html#tp_descr_set)535536,537538[`tp_dictoffset`](https://python-all.ru/2.6/c-api/typeobj.html#tp_dictoffset)539540,541542[`tp_init`](https://python-all.ru/2.6/c-api/typeobj.html#tp_init)543544,545546[`tp_alloc`](https://python-all.ru/2.6/c-api/typeobj.html#tp_alloc)547548,549550[`tp_new`](https://python-all.ru/2.6/c-api/typeobj.html#tp_new)551552,553554[`tp_free`](https://python-all.ru/2.6/c-api/typeobj.html#tp_free)555556,557558[`tp_is_gc`](https://python-all.ru/2.6/c-api/typeobj.html#tp_is_gc)559560,561562[`tp_bases`](https://python-all.ru/2.6/c-api/typeobj.html#tp_bases)563564,565566[`tp_mro`](https://python-all.ru/2.6/c-api/typeobj.html#tp_mro)567568,569570[`tp_cache`](https://python-all.ru/2.6/c-api/typeobj.html#tp_cache)571572,573574[`tp_subclasses`](https://python-all.ru/2.6/c-api/typeobj.html#tp_subclasses)575576и577578[`tp_weaklist`](https://python-all.ru/2.6/c-api/typeobj.html#tp_weaklist)579580.581582#### `Py_TPFLAGS_HEAPTYPE`583584Этот бит устанавливается, когда сам объект типа выделяется в куче. В этом случае поле585586[`ob_type`](https://python-all.ru/2.6/c-api/typeobj.html#ob_type)587588его экземпляров считается ссылкой на тип, и объект типа увеличивает счётчик ссылок (INCREF) при создании нового экземпляра и уменьшает (DECREF) при уничтожении экземпляра (это не относится к экземплярам подтипов; только тип, на который ссылается ob\_type экземпляра, получает INCREF или DECREF).589590#### `Py_TPFLAGS_BASETYPE`591592Этот бит устанавливается, когда тип может использоваться как базовый тип другого типа. Если этот бит сброшен, тип не может быть унаследован (аналогично «финальному» классу в Java).593594#### `Py_TPFLAGS_READY`595596Этот бит устанавливается, когда объект типа был полностью инициализирован с помощью597598[`PyType_Ready()`](https://python-all.ru/2.6/c-api/type.html#PyType_Ready)599600.601602#### `Py_TPFLAGS_READYING`603604Этот бит устанавливается, пока605606[`PyType_Ready()`](https://python-all.ru/2.6/c-api/type.html#PyType_Ready)607608находится в процессе инициализации объекта типа.609610#### `Py_TPFLAGS_HAVE_GC`611612Этот бит установлен, если объект поддерживает сборку мусора. Если этот бит установлен, экземпляры должны создаваться с помощью613614[`PyObject_GC_New()`](https://python-all.ru/2.6/c-api/gcsupport.html#PyObject_GC_New)615616и уничтожаться с помощью617618[`PyObject_GC_Del()`](https://python-all.ru/2.6/c-api/gcsupport.html#PyObject_GC_Del)619620. Дополнительную информацию см. в разделе621622[*Поддержка циклической сборки мусора*](https://python-all.ru/2.6/c-api/gcsupport.html#supporting-cycle-detection)623624. Этот бит также означает, что связанные со сборкой мусора поля625626[`tp_traverse`](https://python-all.ru/2.6/c-api/typeobj.html#tp_traverse)627628и629630[`tp_clear`](https://python-all.ru/2.6/c-api/typeobj.html#tp_clear)631632присутствуют в объекте типа; однако эти поля также существуют, когда633634[`Py_TPFLAGS_HAVE_GC`](https://python-all.ru/2.6/c-api/typeobj.html#Py_TPFLAGS_HAVE_GC)635636сброшен, но637638[`Py_TPFLAGS_HAVE_RICHCOMPARE`](https://python-all.ru/2.6/c-api/typeobj.html#Py_TPFLAGS_HAVE_RICHCOMPARE)639640установлен.641642#### `Py_TPFLAGS_DEFAULT`643644Это битовая маска всех битов, относящихся к существованию определённых полей в объекте типа и его структурах расширения. В настоящее время она включает следующие биты:645646[`Py_TPFLAGS_HAVE_GETCHARBUFFER`](https://python-all.ru/2.6/c-api/typeobj.html#Py_TPFLAGS_HAVE_GETCHARBUFFER)647648,649650[`Py_TPFLAGS_HAVE_SEQUENCE_IN`](https://python-all.ru/2.6/c-api/typeobj.html#Py_TPFLAGS_HAVE_SEQUENCE_IN)651652,653654[`Py_TPFLAGS_HAVE_INPLACEOPS`](https://python-all.ru/2.6/c-api/typeobj.html#Py_TPFLAGS_HAVE_INPLACEOPS)655656,657658[`Py_TPFLAGS_HAVE_RICHCOMPARE`](https://python-all.ru/2.6/c-api/typeobj.html#Py_TPFLAGS_HAVE_RICHCOMPARE)659660,661662[`Py_TPFLAGS_HAVE_WEAKREFS`](https://python-all.ru/2.6/c-api/typeobj.html#Py_TPFLAGS_HAVE_WEAKREFS)663664,665666[`Py_TPFLAGS_HAVE_ITER`](https://python-all.ru/2.6/c-api/typeobj.html#Py_TPFLAGS_HAVE_ITER)667668и669670[`Py_TPFLAGS_HAVE_CLASS`](https://python-all.ru/2.6/c-api/typeobj.html#Py_TPFLAGS_HAVE_CLASS)671672.673674**char\* [PyTypeObject](https://python-all.ru/2.6/c-api/type.html#PyTypeObject).`tp_doc`**675676Необязательный указатель на C-строку, завершающуюся NUL, содержащую строку документации для этого объекта типа. Он доступен как атрибут `__doc__` у типа и его экземпляров.677678Это поле *не* наследуется подтипами.679680Следующие три поля существуют только в том случае, если установлен бит флага [`Py_TPFLAGS_HAVE_RICHCOMPARE`](https://python-all.ru/2.6/c-api/typeobj.html#Py_TPFLAGS_HAVE_RICHCOMPARE).681682**[traverseproc](https://python-all.ru/2.6/c-api/gcsupport.html#traverseproc) [PyTypeObject](https://python-all.ru/2.6/c-api/type.html#PyTypeObject).`tp_traverse`**683684Необязательный указатель на функцию обхода для сборщика мусора. Используется только если установлен бит флага [`Py_TPFLAGS_HAVE_GC`](https://python-all.ru/2.6/c-api/typeobj.html#Py_TPFLAGS_HAVE_GC). Дополнительную информацию о схеме сборки мусора в Python можно найти в разделе [*Supporting Cyclic Garbage Collection*](https://python-all.ru/2.6/c-api/gcsupport.html#supporting-cycle-detection).685686Указатель [`tp_traverse`](https://python-all.ru/2.6/c-api/typeobj.html#tp_traverse) используется сборщиком мусора для обнаружения циклических ссылок. Типичная реализация функции [`tp_traverse`](https://python-all.ru/2.6/c-api/typeobj.html#tp_traverse) просто вызывает [`Py_VISIT()`](https://python-all.ru/2.6/c-api/gcsupport.html#Py_VISIT) для каждого из членов экземпляра, являющихся объектами Python. Например, это функция `local_traverse()` из модуля расширения [`поток`](https://python-all.ru/2.6/library/thread.html#module-thread):687688```c689static int690local_traverse(localobject *self, visitproc visit, void *arg)691{692    Py_VISIT(self->args);693    Py_VISIT(self->kw);694    Py_VISIT(self->dict);695    return 0;696}697```698699Обратите внимание, что [`Py_VISIT()`](https://python-all.ru/2.6/c-api/gcsupport.html#Py_VISIT) вызывается только для тех членов, которые могут участвовать в циклических ссылках. Хотя есть также член `self->key`, он может быть только *NULL* или строкой Python и поэтому не может быть частью циклической ссылки.700701С другой стороны, даже если известно, что член никогда не может быть частью цикла, в качестве средства отладки может потребоваться посетить его всё равно, чтобы функция `get_referents()` модуля [`gc`](https://python-all.ru/2.6/library/gc.html#module-gc) включала его.702703Обратите внимание, что [`Py_VISIT()`](https://python-all.ru/2.6/c-api/gcsupport.html#Py_VISIT) требует, чтобы параметры *visit* и *arg* функции `local_traverse()` имели именно такие имена; не называйте их как угодно.704705Это поле наследуется подтипами вместе с [`tp_clear`](https://python-all.ru/2.6/c-api/typeobj.html#tp_clear) и битом флага [`Py_TPFLAGS_HAVE_GC`](https://python-all.ru/2.6/c-api/typeobj.html#Py_TPFLAGS_HAVE_GC): бит флага, [`tp_traverse`](https://python-all.ru/2.6/c-api/typeobj.html#tp_traverse) и [`tp_clear`](https://python-all.ru/2.6/c-api/typeobj.html#tp_clear) наследуются от базового типа, если все они равны нулю в подтипе *и* в подтипе установлен бит флага [`Py_TPFLAGS_HAVE_RICHCOMPARE`](https://python-all.ru/2.6/c-api/typeobj.html#Py_TPFLAGS_HAVE_RICHCOMPARE).706707**[inquiry](https://python-all.ru/2.6/c-api/gcsupport.html#inquiry) [PyTypeObject](https://python-all.ru/2.6/c-api/type.html#PyTypeObject).`tp_clear`**708709Необязательный указатель на функцию очистки для сборщика мусора. Используется только если установлен бит флага [`Py_TPFLAGS_HAVE_GC`](https://python-all.ru/2.6/c-api/typeobj.html#Py_TPFLAGS_HAVE_GC).710711Функция-член [`tp_clear`](https://python-all.ru/2.6/c-api/typeobj.html#tp_clear) используется для разрыва циклических ссылок в циклическом мусоре, обнаруженном сборщиком мусора. В совокупности все функции [`tp_clear`](https://python-all.ru/2.6/c-api/typeobj.html#tp_clear) в системе должны вместе разрывать все циклические ссылки. Это тонкий момент, и если есть сомнения, стоит предоставить функцию [`tp_clear`](https://python-all.ru/2.6/c-api/typeobj.html#tp_clear). Например, тип tuple не реализует функцию [`tp_clear`](https://python-all.ru/2.6/c-api/typeobj.html#tp_clear), поскольку можно доказать, что никакая циклическая ссылка не может состоять только из кортежей. Поэтому функции [`tp_clear`](https://python-all.ru/2.6/c-api/typeobj.html#tp_clear) других типов должны быть достаточны для разрыва любой циклической ссылки, содержащей кортеж. Это не сразу очевидно, и редко есть веская причина избегать реализации [`tp_clear`](https://python-all.ru/2.6/c-api/typeobj.html#tp_clear).712713Реализации [`tp_clear`](https://python-all.ru/2.6/c-api/typeobj.html#tp_clear) должны обнулять ссылки экземпляра на те его члены, которые могут быть объектами Python, и устанавливать указатели на эти члены в *NULL*, как в следующем примере:714715```c716static int717local_clear(localobject *self)718{719    Py_CLEAR(self->key);720    Py_CLEAR(self->args);721    Py_CLEAR(self->kw);722    Py_CLEAR(self->dict);723    return 0;724}725```726727Следует использовать макрос [`Py_CLEAR()`](https://python-all.ru/2.6/c-api/refcounting.html#Py_CLEAR), поскольку очистка ссылок – деликатная операция: ссылка на содержащийся объект не должна уменьшаться до тех пор, пока указатель на содержащийся объект не будет установлен в *NULL*. Это связано с тем, что уменьшение счётчика ссылок может привести к тому, что содержащийся объект станет мусором, что вызовет цепочку действий по его освобождению, которая может включать вызов произвольного кода Python (из-за финализаторов или колбэков слабых ссылок, связанных с содержащимся объектом). Если такой код может снова обратиться к *self*, важно, чтобы указатель на содержащийся объект в этот момент был *NULL*, чтобы *self* знал, что содержащийся объект больше не может использоваться. Макрос [`Py_CLEAR()`](https://python-all.ru/2.6/c-api/refcounting.html#Py_CLEAR) выполняет операции в безопасном порядке.728729Поскольку цель функций [`tp_clear`](https://python-all.ru/2.6/c-api/typeobj.html#tp_clear) – разрывать циклические ссылки, нет необходимости очищать содержащиеся объекты, такие как строки или целые числа Python, которые не могут участвовать в циклических ссылках. С другой стороны, может быть удобно очищать все содержащиеся объекты Python и реализовать функцию [`tp_dealloc`](https://python-all.ru/2.6/c-api/typeobj.html#tp_dealloc) типа так, чтобы она вызывала [`tp_clear`](https://python-all.ru/2.6/c-api/typeobj.html#tp_clear).730731Дополнительную информацию о схеме сборки мусора Python можно найти в разделе [*Поддержка циклической сборки мусора*](https://python-all.ru/2.6/c-api/gcsupport.html#supporting-cycle-detection).732733Это поле наследуется подтипами вместе с [`tp_traverse`](https://python-all.ru/2.6/c-api/typeobj.html#tp_traverse) и флагом [`Py_TPFLAGS_HAVE_GC`](https://python-all.ru/2.6/c-api/typeobj.html#Py_TPFLAGS_HAVE_GC): флаг, [`tp_traverse`](https://python-all.ru/2.6/c-api/typeobj.html#tp_traverse) и [`tp_clear`](https://python-all.ru/2.6/c-api/typeobj.html#tp_clear) наследуются от базового типа, если все они равны нулю в подтипе *и* подтип имеет установленным флаг [`Py_TPFLAGS_HAVE_RICHCOMPARE`](https://python-all.ru/2.6/c-api/typeobj.html#Py_TPFLAGS_HAVE_RICHCOMPARE).734735**richcmpfunc [PyTypeObject](https://python-all.ru/2.6/c-api/type.html#PyTypeObject).`tp_richcompare`**736737Необязательный указатель на функцию сравнения с сигнатурой: `PyObject *tp_richcompare(PyObject *a, PyObject *b, int op)`.738739Функция должна возвращать результат сравнения (обычно `Py_True` или `Py_False`). Если сравнение не определено, она должна вернуть `Py_NotImplemented`; если произошла другая ошибка – вернуть `NULL` и установить условие исключения.740741> **Примечание**742>743> Если требуется реализовать тип, для которого имеет смысл только ограниченный набор сравнений (например, `==` и `!=`, но не `<` и подобные), следует напрямую возбуждать [`TypeError`](https://python-all.ru/2.6/library/exceptions.html#exceptions.TypeError) в функции расширенного сравнения.744745Это поле наследуется подтипами вместе с [`tp_compare`](https://python-all.ru/2.6/c-api/typeobj.html#tp_compare) и [`tp_hash`](https://python-all.ru/2.6/c-api/typeobj.html#tp_hash): подтип наследует все три: [`tp_compare`](https://python-all.ru/2.6/c-api/typeobj.html#tp_compare), [`tp_richcompare`](https://python-all.ru/2.6/c-api/typeobj.html#tp_richcompare) и [`tp_hash`](https://python-all.ru/2.6/c-api/typeobj.html#tp_hash), когда [`tp_compare`](https://python-all.ru/2.6/c-api/typeobj.html#tp_compare), [`tp_richcompare`](https://python-all.ru/2.6/c-api/typeobj.html#tp_richcompare) и [`tp_hash`](https://python-all.ru/2.6/c-api/typeobj.html#tp_hash) подтипа равны *NULL*.746747Следующие константы определены для использования в качестве третьего аргумента для [`tp_richcompare`](https://python-all.ru/2.6/c-api/typeobj.html#tp_richcompare) и для [`PyObject_RichCompare()`](https://python-all.ru/2.6/c-api/object.html#PyObject_RichCompare):748749| Константа | Сравнение |750| --- | --- |751| `Py_LT` | `<` |752| `Py_LE` | `<=` |753| `Py_EQ` | `==` |754| `Py_NE` | `!=` |755| `Py_GT` | `>` |756| `Py_GE` | `>=` |757758Следующее поле существует только в том случае, если установлен бит флага [`Py_TPFLAGS_HAVE_WEAKREFS`](https://python-all.ru/2.6/c-api/typeobj.html#Py_TPFLAGS_HAVE_WEAKREFS).759760**long [PyTypeObject](https://python-all.ru/2.6/c-api/type.html#PyTypeObject).`tp_weaklistoffset`**761762Если экземпляры этого типа поддерживают слабые ссылки, это поле больше нуля и содержит смещение в структуре экземпляра до головы списка слабых ссылок (игнорируя заголовок GC, если он присутствует); это смещение используется функциями `PyObject_ClearWeakRefs()` и `PyWeakref_*()`. Структура экземпляра должна содержать поле типа [`PyObject*`](https://python-all.ru/2.6/c-api/structures.html#PyObject), которое инициализируется значением *NULL*.763764Не путайте это поле с [`tp_weaklist`](https://python-all.ru/2.6/c-api/typeobj.html#tp_weaklist); это голова списка для слабых ссылок на сам объект типа.765766Это поле наследуется подтипами, но см. правила ниже. Подтип может переопределить это смещение; это означает, что подтип использует другую голову списка слабых ссылок, чем базовый тип. Поскольку голова списка всегда находится через [`tp_weaklistoffset`](https://python-all.ru/2.6/c-api/typeobj.html#tp_weaklistoffset), это не должно быть проблемой.767768Когда тип, определённый с помощью class, не имеет объявления [`__slots__`](https://python-all.ru/2.6/reference/datamodel.html#__slots__), и ни один из его базовых типов не поддерживает слабые ссылки, тип становится поддерживающим слабые ссылки путём добавления слота головы списка слабых ссылок в структуру экземпляра и установки [`tp_weaklistoffset`](https://python-all.ru/2.6/c-api/typeobj.html#tp_weaklistoffset) в смещение этого слота.769770Когда объявление [`__slots__`](https://python-all.ru/2.6/reference/datamodel.html#__slots__) типа содержит слот с именем `__weakref__`, этот слот становится головой списка слабых ссылок для экземпляров типа, и смещение слота сохраняется в [`tp_weaklistoffset`](https://python-all.ru/2.6/c-api/typeobj.html#tp_weaklistoffset) типа.771772Когда объявление [`__slots__`](https://python-all.ru/2.6/reference/datamodel.html#__slots__) типа не содержит слот с именем `__weakref__`, тип наследует свой [`tp_weaklistoffset`](https://python-all.ru/2.6/c-api/typeobj.html#tp_weaklistoffset) от базового типа.773774Следующие два поля существуют только в том случае, если установлен бит флага [`Py_TPFLAGS_HAVE_ITER`](https://python-all.ru/2.6/c-api/typeobj.html#Py_TPFLAGS_HAVE_ITER).775776**getiterfunc [PyTypeObject](https://python-all.ru/2.6/c-api/type.html#PyTypeObject).`tp_iter`**777778Необязательный указатель на функцию, возвращающую итератор для объекта. Его наличие обычно означает, что экземпляры этого типа являются итерируемыми (хотя последовательности могут быть итерируемыми и без этой функции, а экземпляры классического типа всегда имеют эту функцию, даже если они не определяют метод [`__iter__()`](https://python-all.ru/2.6/reference/datamodel.html#object.__iter__)).779780Эта функция имеет ту же сигнатуру, что и [`PyObject_GetIter()`](https://python-all.ru/2.6/c-api/object.html#PyObject_GetIter).781782Это поле наследуется подтипами.783784**iternextfunc [PyTypeObject](https://python-all.ru/2.6/c-api/type.html#PyTypeObject).`tp_iternext`**785786Необязательный указатель на функцию, возвращающую следующий элемент итератора. Когда итератор исчерпан, она должна вернуть *NULL*; исключение [`StopIteration`](https://python-all.ru/2.6/library/exceptions.html#exceptions.StopIteration) может быть установлено, а может и нет. При возникновении другой ошибки она также должна вернуть *NULL*. Ее наличие обычно означает, что экземпляры этого типа являются итераторами (хотя экземпляры классического типа всегда имеют эту функцию, даже если они не определяют метод [`next()`](https://python-all.ru/2.6/library/functions.html#next)).787788Типы-итераторы также должны определять функцию [`tp_iter`](https://python-all.ru/2.6/c-api/typeobj.html#tp_iter), и эта функция должна возвращать сам экземпляр итератора (не новый экземпляр итератора).789790Эта функция имеет ту же сигнатуру, что и [`PyIter_Next()`](https://python-all.ru/2.6/c-api/iter.html#PyIter_Next).791792Это поле наследуется подтипами.793794Следующие поля, вплоть до [`tp_weaklist`](https://python-all.ru/2.6/c-api/typeobj.html#tp_weaklist) включительно, существуют только если установлен бит флага [`Py_TPFLAGS_HAVE_CLASS`](https://python-all.ru/2.6/c-api/typeobj.html#Py_TPFLAGS_HAVE_CLASS).795796**struct [PyMethodDef](https://python-all.ru/2.6/c-api/structures.html#PyMethodDef)\* [PyTypeObject](https://python-all.ru/2.6/c-api/type.html#PyTypeObject).`tp_methods`**797798Необязательный указатель на статический массив структур [`PyMethodDef`](https://python-all.ru/2.6/c-api/structures.html#PyMethodDef), завершающийся *NULL*, объявляющий обычные методы этого типа.799800Для каждой записи массива в словарь типа (см. [`tp_dict`](https://python-all.ru/2.6/c-api/typeobj.html#tp_dict) ниже) добавляется запись, содержащая дескриптор метода.801802Это поле не наследуется подтипами (методы наследуются через другой механизм).803804**struct [PyMemberDef](https://python-all.ru/2.6/c-api/structures.html#PyMemberDef)\* [PyTypeObject](https://python-all.ru/2.6/c-api/type.html#PyTypeObject).`tp_members`**805806Необязательный указатель на статический массив структур [`PyMemberDef`](https://python-all.ru/2.6/c-api/structures.html#PyMemberDef), завершающийся *NULL*, объявляющий обычные элементы данных (поля или слоты) экземпляров этого типа.807808Для каждой записи массива в словарь типа (см. [`tp_dict`](https://python-all.ru/2.6/c-api/typeobj.html#tp_dict) ниже) добавляется запись, содержащая дескриптор элемента.809810Это поле не наследуется подтипами (члены наследуются через другой механизм).811812**struct PyGetSetDef\* [PyTypeObject](https://python-all.ru/2.6/c-api/type.html#PyTypeObject).`tp_getset`**813814Необязательный указатель на статический массив структур `PyGetSetDef`, завершающийся *NULL*, объявляющий вычисляемые атрибуты экземпляров этого типа.815816Для каждой записи массива в словарь типа (см. [`tp_dict`](https://python-all.ru/2.6/c-api/typeobj.html#tp_dict) ниже) добавляется запись, содержащая дескриптор getset.817818Это поле не наследуется подтипами (вычисляемые атрибуты наследуются через другой механизм).819820Документация для PyGetSetDef (XXX должна быть в другом месте):821822```c823typedef PyObject *(*getter)(PyObject *, void *);824typedef int (*setter)(PyObject *, PyObject *, void *);825826typedef struct PyGetSetDef {827    char *name;    /* имя атрибута */828    getter get;    /* C-функция для получения атрибута */829    setter set;    /* C-функция для установки атрибута */830    char *doc;     /* необязательная строка документации */831    void *closure; /* необязательные дополнительные данные для геттера и сеттера */832} PyGetSetDef;833```834835**[PyTypeObject](https://python-all.ru/2.6/c-api/type.html#PyTypeObject)\* [PyTypeObject](https://python-all.ru/2.6/c-api/type.html#PyTypeObject).`tp_base`**836837Необязательный указатель на базовый тип, от которого наследуются свойства типа. На этом уровне поддерживается только одиночное наследование; множественное наследование требует динамического создания объекта типа вызовом метатипа.838839Это поле не наследуется подтипами (очевидно), но по умолчанию оно равно `&PyBaseObject_Type` (которое программистам Python известно как тип [`object`](https://python-all.ru/2.6/library/functions.html#object)).840841**[PyObject](https://python-all.ru/2.6/c-api/structures.html#PyObject)\* [PyTypeObject](https://python-all.ru/2.6/c-api/type.html#PyTypeObject).`tp_dict`**842843Словарь типа сохраняется здесь функцией [`PyType_Ready()`](https://python-all.ru/2.6/c-api/type.html#PyType_Ready).844845Обычно это поле должно быть инициализировано значением *NULL* перед вызовом PyType\_Ready; его также можно инициализировать словарём, содержащим начальные атрибуты типа. После того как [`PyType_Ready()`](https://python-all.ru/2.6/c-api/type.html#PyType_Ready) инициализирует тип, в этот словарь можно добавлять дополнительные атрибуты только если они не соответствуют перегруженным операциям (например, [`__add__()`](https://python-all.ru/2.6/reference/datamodel.html#object.__add__)).846847Это поле не наследуется подтипами (хотя определённые здесь атрибуты наследуются через другой механизм).848849**descrgetfunc [PyTypeObject](https://python-all.ru/2.6/c-api/type.html#PyTypeObject).`tp_descr_get`**850851Необязательный указатель на функцию «descriptor get».852853Сигнатура функции:854855```c856PyObject * tp_descr_get(PyObject *self, PyObject *obj, PyObject *type);857```858859XXX объяснить.860861Это поле наследуется подтипами.862863**descrsetfunc [PyTypeObject](https://python-all.ru/2.6/c-api/type.html#PyTypeObject).`tp_descr_set`**864865Необязательный указатель на функцию «установки дескриптора».866867Сигнатура функции:868869```c870int tp_descr_set(PyObject *self, PyObject *obj, PyObject *value);871```872873Это поле наследуется подтипами.874875XXX объяснить.876877**long [PyTypeObject](https://python-all.ru/2.6/c-api/type.html#PyTypeObject).`tp_dictoffset`**878879Если экземпляры этого типа имеют словарь, содержащий переменные экземпляра, это поле не равно нулю и содержит смещение словаря переменных экземпляра в структуре экземпляров типа; это смещение используется функцией [`PyObject_GenericGetAttr()`](https://python-all.ru/2.6/c-api/object.html#PyObject_GenericGetAttr).880881Не путайте это поле с [`tp_dict`](https://python-all.ru/2.6/c-api/typeobj.html#tp_dict); это словарь для атрибутов самого объекта типа.882883Если значение этого поля больше нуля, оно задаёт смещение от начала структуры экземпляра. Если значение меньше нуля, оно задаёт смещение от *конца* структуры экземпляра. Отрицательное смещение использовать дороже, и его следует применять только если структура экземпляра содержит часть переменной длины. Это используется, например, для добавления словаря переменных экземпляра к подтипам [`str`](https://python-all.ru/2.6/library/functions.html#str) или [`tuple`](https://python-all.ru/2.6/library/functions.html#tuple). Обратите внимание, что поле [`tp_basicsize`](https://python-all.ru/2.6/c-api/typeobj.html#tp_basicsize) должно учитывать словарь, добавленный в конец, даже если сам словарь не входит в базовую компоновку объекта. В системе с размером указателя 4 байта [`tp_dictoffset`](https://python-all.ru/2.6/c-api/typeobj.html#tp_dictoffset) должно быть установлено в `-4`, чтобы указать, что словарь находится в самом конце структуры.884885Реальное смещение словаря в экземпляре можно вычислить из отрицательного [`tp_dictoffset`](https://python-all.ru/2.6/c-api/typeobj.html#tp_dictoffset) следующим образом:886887```c888dictoffset = tp_basicsize + abs(ob_size)*tp_itemsize + tp_dictoffset889if dictoffset is not aligned on sizeof(void*):890    round up to sizeof(void*)891```892893где [`tp_basicsize`](https://python-all.ru/2.6/c-api/typeobj.html#tp_basicsize), [`tp_itemsize`](https://python-all.ru/2.6/c-api/typeobj.html#tp_itemsize) и [`tp_dictoffset`](https://python-all.ru/2.6/c-api/typeobj.html#tp_dictoffset) берутся из объекта типа, а [`ob_size`](https://python-all.ru/2.6/c-api/typeobj.html#ob_size) берётся из экземпляра. Берётся абсолютное значение, потому что длинные целые числа используют знак [`ob_size`](https://python-all.ru/2.6/c-api/typeobj.html#ob_size) для хранения знака числа. (Никогда не нужно выполнять этот расчёт самостоятельно; он делается за вас функцией `_PyObject_GetDictPtr()`.)894895Это поле наследуется подтипами, но обратитесь к списку правил ниже. Подтип может переопределить это смещение; это означает, что экземпляры подтипа хранят словарь по другому смещению, нежели базовый тип. Поскольку словарь всегда находится через [`tp_dictoffset`](https://python-all.ru/2.6/c-api/typeobj.html#tp_dictoffset), это не должно вызывать проблем.896897Когда тип, определённый с помощью оператора class, не содержит объявления [`__slots__`](https://python-all.ru/2.6/reference/datamodel.html#__slots__) и ни один из его базовых типов не имеет словаря переменных экземпляра, в макет экземпляра добавляется слот для словаря, а [`tp_dictoffset`](https://python-all.ru/2.6/c-api/typeobj.html#tp_dictoffset) устанавливается в смещение этого слота.898899Когда тип, определённый с помощью оператора class, имеет объявление [`__slots__`](https://python-all.ru/2.6/reference/datamodel.html#__slots__), тип наследует свой [`tp_dictoffset`](https://python-all.ru/2.6/c-api/typeobj.html#tp_dictoffset) от базового типа.900901(Добавление слота с именем `__dict__` в объявление [`__slots__`](https://python-all.ru/2.6/reference/datamodel.html#__slots__) не даёт ожидаемого эффекта, а только вносит путаницу. Хотя, возможно, это следует добавить как функцию, аналогично `__weakref__`.)902903**initproc [PyTypeObject](https://python-all.ru/2.6/c-api/type.html#PyTypeObject).`tp_init`**904905Необязательный указатель на функцию инициализации экземпляра.906907Эта функция соответствует методу классов [`__init__()`](https://python-all.ru/2.6/reference/datamodel.html#object.__init__). Как и для [`__init__()`](https://python-all.ru/2.6/reference/datamodel.html#object.__init__), можно создать экземпляр, не вызывая [`__init__()`](https://python-all.ru/2.6/reference/datamodel.html#object.__init__), а также можно переинициализировать экземпляр, повторно вызвав его метод [`__init__()`](https://python-all.ru/2.6/reference/datamodel.html#object.__init__).908909Сигнатура функции:910911```c912int tp_init(PyObject *self, PyObject *args, PyObject *kwds)913```914915Аргумент self – это инициализируемый экземпляр; аргументы *args* и *kwds* представляют позиционные и именованные аргументы вызова [`__init__()`](https://python-all.ru/2.6/reference/datamodel.html#object.__init__).916917Функция [`tp_init`](https://python-all.ru/2.6/c-api/typeobj.html#tp_init), если она не равна *NULL*, вызывается при обычном создании экземпляра через вызов его типа, после того как функция [`tp_new`](https://python-all.ru/2.6/c-api/typeobj.html#tp_new) типа вернула экземпляр этого типа. Если функция [`tp_new`](https://python-all.ru/2.6/c-api/typeobj.html#tp_new) возвращает экземпляр какого-то другого типа, не являющегося подтипом исходного, функция [`tp_init`](https://python-all.ru/2.6/c-api/typeobj.html#tp_init) не вызывается; если [`tp_new`](https://python-all.ru/2.6/c-api/typeobj.html#tp_new) возвращает экземпляр подтипа исходного типа, вызывается [`tp_init`](https://python-all.ru/2.6/c-api/typeobj.html#tp_init) этого подтипа. (ПРИМЕЧАНИЕ О ВЕРСИИ: описанное здесь реализовано в Python 2.2.1 и более новых версиях. В Python 2.2 всегда вызывался [`tp_init`](https://python-all.ru/2.6/c-api/typeobj.html#tp_init) типа объекта, возвращённого [`tp_new`](https://python-all.ru/2.6/c-api/typeobj.html#tp_new), если он не был *NULL*.)918919Это поле наследуется подтипами.920921**allocfunc [PyTypeObject](https://python-all.ru/2.6/c-api/type.html#PyTypeObject).`tp_alloc`**922923Необязательный указатель на функцию выделения экземпляра.924925Сигнатура функции:926927```c928PyObject *tp_alloc(PyTypeObject *self, Py_ssize_t nitems)929```930931Назначение этой функции – разделить выделение памяти и её инициализацию. Она должна возвращать указатель на блок памяти достаточной длины для экземпляра, с подходящим выравниванием, обнулённый, но с [`ob_refcnt`](https://python-all.ru/2.6/c-api/typeobj.html#ob_refcnt), установленным в `1`, и [`ob_type`](https://python-all.ru/2.6/c-api/typeobj.html#ob_type), установленным в аргумент type. Если [`tp_itemsize`](https://python-all.ru/2.6/c-api/typeobj.html#tp_itemsize) типа не равен нулю, поле [`ob_size`](https://python-all.ru/2.6/c-api/typeobj.html#ob_size) объекта должно быть инициализировано значением *nitems*, а длина выделенного блока памяти должна быть `tp_basicsize + nitems*tp_itemsize`, округлённая вверх до кратного `sizeof(void*)`; в противном случае *nitems* не используется, и длина блока должна быть [`tp_basicsize`](https://python-all.ru/2.6/c-api/typeobj.html#tp_basicsize).932933Не используйте эту функцию для какой-либо другой инициализации экземпляра, даже для выделения дополнительной памяти; это должно делаться с помощью [`tp_new`](https://python-all.ru/2.6/c-api/typeobj.html#tp_new).934935Это поле наследуется статическими подтипами, но не динамическими (подтипами, созданными с помощью оператора class); у последних это поле всегда устанавливается в [`PyType_GenericAlloc()`](https://python-all.ru/2.6/c-api/type.html#PyType_GenericAlloc), чтобы принудительно применить стандартную стратегию выделения памяти в куче. Это же значение рекомендуется и для статически определённых типов.936937**newfunc [PyTypeObject](https://python-all.ru/2.6/c-api/type.html#PyTypeObject).`tp_new`**938939Необязательный указатель на функцию создания экземпляра.940941Если для данного типа эта функция равна *NULL*, то этот тип нельзя вызвать для создания новых экземпляров; предполагается, что существует другой способ создания экземпляров, например, фабричная функция.942943Сигнатура функции:944945```c946PyObject *tp_new(PyTypeObject *subtype, PyObject *args, PyObject *kwds)947```948949Аргумент subtype – это тип создаваемого объекта; аргументы *args* и *kwds* представляют позиционные и именованные аргументы вызова типа. Обратите внимание, что subtype не обязан совпадать с типом, чья функция [`tp_new`](https://python-all.ru/2.6/c-api/typeobj.html#tp_new) вызывается; это может быть подтип этого типа (но не какой-то другой, не связанный тип).950951Функция [`tp_new`](https://python-all.ru/2.6/c-api/typeobj.html#tp_new) должна вызывать `subtype->tp_alloc(subtype, nitems)` для выделения памяти под объект, а затем выполнять лишь ту дополнительную инициализацию, которая абсолютно необходима. Инициализация, которую можно безопасно пропустить или повторить, должна быть помещена в обработчик [`tp_init`](https://python-all.ru/2.6/c-api/typeobj.html#tp_init). Хорошее эмпирическое правило: для неизменяемых типов вся инициализация должна происходить в [`tp_new`](https://python-all.ru/2.6/c-api/typeobj.html#tp_new), а для изменяемых типов большую часть инициализации следует откладывать до [`tp_init`](https://python-all.ru/2.6/c-api/typeobj.html#tp_init).952953Это поле наследуется подтипами, за исключением статических типов, у которых [`tp_base`](https://python-all.ru/2.6/c-api/typeobj.html#tp_base) равен *NULL* или `&PyBaseObject_Type`. Последнее исключение – это мера предосторожности, чтобы старые расширенные типы не становились вызываемыми просто из-за связывания с Python 2.2.954955**destructor [PyTypeObject](https://python-all.ru/2.6/c-api/type.html#PyTypeObject).`tp_free`**956957Необязательный указатель на функцию освобождения экземпляра.958959Сигнатура этой функции немного изменилась: в Python 2.2 и 2.2.1 её сигнатура – `destructor`:960961```c962void tp_free(PyObject *)963```964965В Python 2.3 и новее её сигнатура – `freefunc`:966967```c968void tp_free(void *)969```970971Единственный инициализатор, совместимый с обеими версиями, – это `_PyObject_Del`, чьё определение было соответствующим образом адаптировано в Python 2.3.972973Это поле наследуется статическими подтипами, но не динамическими (подтипами, созданными с помощью оператора class); у последних это поле устанавливается в деаллокатор, подходящий для [`PyType_GenericAlloc()`](https://python-all.ru/2.6/c-api/type.html#PyType_GenericAlloc) и значения флага [`Py_TPFLAGS_HAVE_GC`](https://python-all.ru/2.6/c-api/typeobj.html#Py_TPFLAGS_HAVE_GC).974975**[inquiry](https://python-all.ru/2.6/c-api/gcsupport.html#inquiry) [PyTypeObject](https://python-all.ru/2.6/c-api/type.html#PyTypeObject).`tp_is_gc`**976977Необязательный указатель на функцию, вызываемую сборщиком мусора.978979Сборщику мусора необходимо знать, подлежит ли конкретный объект сборке или нет. Обычно достаточно посмотреть на поле [`tp_flags`](https://python-all.ru/2.6/c-api/typeobj.html#tp_flags) типа объекта и проверить флаг [`Py_TPFLAGS_HAVE_GC`](https://python-all.ru/2.6/c-api/typeobj.html#Py_TPFLAGS_HAVE_GC). Но у некоторых типов имеется смесь статически и динамически выделенных экземпляров, и статически выделенные экземпляры не подлежат сборке. Таким типам следует определить эту функцию; она должна возвращать `1` для подлежащего сборке экземпляра и `0` – для неподлежащего. Сигнатура:980981```c982int tp_is_gc(PyObject *self)983```984985(Единственный пример этого – сами типы. Метатип [`PyType_Type`](https://python-all.ru/2.6/c-api/type.html#PyType_Type) определяет эту функцию, чтобы различать статически и динамически выделенные типы.)986987Это поле наследуется подтипами. (ПРИМЕЧАНИЕ ПО ВЕРСИЯМ: в Python 2.2 оно не наследовалось. Оно наследуется в 2.2.1 и более новых версиях.)988989**[PyObject](https://python-all.ru/2.6/c-api/structures.html#PyObject)\* [PyTypeObject](https://python-all.ru/2.6/c-api/type.html#PyTypeObject).`tp_bases`**990991Кортеж базовых типов.992993Это устанавливается для типов, созданных с помощью оператора class. Для статически определённых типов оно должно быть равно *NULL*.994995Это поле не наследуется.996997**[PyObject](https://python-all.ru/2.6/c-api/structures.html#PyObject)\* [PyTypeObject](https://python-all.ru/2.6/c-api/type.html#PyTypeObject).`tp_mro`**998999Кортеж, содержащий расширенный набор базовых типов, начиная с самого типа и заканчивая [`object`](https://python-all.ru/2.6/library/functions.html#object), в порядке разрешения методов (MRO).10001001Это поле не наследуется; оно вычисляется заново функцией [`PyType_Ready()`](https://python-all.ru/2.6/c-api/type.html#PyType_Ready).10021003**[PyObject](https://python-all.ru/2.6/c-api/structures.html#PyObject)\* [PyTypeObject](https://python-all.ru/2.6/c-api/type.html#PyTypeObject).`tp_cache`**10041005Не используется. Не наследуется. Только для внутреннего использования.10061007**[PyObject](https://python-all.ru/2.6/c-api/structures.html#PyObject)\* [PyTypeObject](https://python-all.ru/2.6/c-api/type.html#PyTypeObject).`tp_subclasses`**10081009Список слабых ссылок на подклассы. Не наследуется. Только для внутреннего использования.10101011**[PyObject](https://python-all.ru/2.6/c-api/structures.html#PyObject)\* [PyTypeObject](https://python-all.ru/2.6/c-api/type.html#PyTypeObject).`tp_weaklist`**10121013Голова списка слабых ссылок для слабых ссылок на этот объект типа. Не наследуется. Только для внутреннего использования.10141015Оставшиеся поля определяются только если определён макрос тестирования функциональности `COUNT_ALLOCS`, и предназначены только для внутреннего использования. Они dокументированы здесь для полноты. Ни одно из этих полей не наследуется подтипами.10161017**Py\_ssize\_t [PyTypeObject](https://python-all.ru/2.6/c-api/type.html#PyTypeObject).`tp_allocs`**10181019Количество выделений памяти.10201021**Py\_ssize\_t [PyTypeObject](https://python-all.ru/2.6/c-api/type.html#PyTypeObject).`tp_frees`**10221023Количество освобождений.10241025**Py\_ssize\_t [PyTypeObject](https://python-all.ru/2.6/c-api/type.html#PyTypeObject).`tp_maxalloc`**10261027Максимальное количество одновременно выделенных объектов.10281029**[PyTypeObject](https://python-all.ru/2.6/c-api/type.html#PyTypeObject)\* [PyTypeObject](https://python-all.ru/2.6/c-api/type.html#PyTypeObject).`tp_next`**10301031Указатель на следующий объект типа с ненулевым полем10321033[`tp_allocs`](https://python-all.ru/2.6/c-api/typeobj.html#tp_allocs)10341035.10361037Также следует отметить, что в Python со сборкой мусора tp\_dealloc может вызываться из любого потока Python, а не только из того, который создал объект (если объект становится частью цикла подсчёта ссылок, этот цикл может быть собран сборщиком мусора в любом потоке). Это не проблема для вызовов Python API, поскольку поток, в котором вызывается tp\_dealloc, будет владеть глобальной блокировкой интерпретатора (GIL). Однако, если уничтожаемый объект, в свою очередь, уничтожает объекты из какой-либо другой библиотеки C или C++, следует соблюдать осторожность, чтобы убедиться, что уничтожение этих объектов в потоке, вызвавшем tp\_dealloc, не нарушит никаких предположений библиотеки.10381039# Структуры числовых объектов10401041**`PyNumberMethods`**10421043Эта структура содержит указатели на функции, которые объект использует для реализации числового протокола. Почти каждая из перечисленных ниже функций используется одноимённой функцией, описанной в разделе [*Числовой протокол*](https://python-all.ru/2.6/c-api/number.html#number).10441045Вот определение структуры:10461047```c1048typedef struct {1049     binaryfunc nb_add;1050     binaryfunc nb_subtract;1051     binaryfunc nb_multiply;1052     binaryfunc nb_divide;1053     binaryfunc nb_remainder;1054     binaryfunc nb_divmod;1055     ternaryfunc nb_power;1056     unaryfunc nb_negative;1057     unaryfunc nb_positive;1058     unaryfunc nb_absolute;1059     inquiry nb_nonzero;       /* Используется PyObject_IsTrue */1060     unaryfunc nb_invert;1061     binaryfunc nb_lshift;1062     binaryfunc nb_rshift;1063     binaryfunc nb_and;1064     binaryfunc nb_xor;1065     binaryfunc nb_or;1066     coercion nb_coerce;       /* Используется функцией coerce() */1067     unaryfunc nb_int;1068     unaryfunc nb_long;1069     unaryfunc nb_float;1070     unaryfunc nb_oct;1071     unaryfunc nb_hex;10721073     /* Добавлено в версии 2.0 */1074     binaryfunc nb_inplace_add;1075     binaryfunc nb_inplace_subtract;1076     binaryfunc nb_inplace_multiply;1077     binaryfunc nb_inplace_divide;1078     binaryfunc nb_inplace_remainder;1079     ternaryfunc nb_inplace_power;1080     binaryfunc nb_inplace_lshift;1081     binaryfunc nb_inplace_rshift;1082     binaryfunc nb_inplace_and;1083     binaryfunc nb_inplace_xor;1084     binaryfunc nb_inplace_or;10851086     /* Добавлено в версии 2.2 */1087     binaryfunc nb_floor_divide;1088     binaryfunc nb_true_divide;1089     binaryfunc nb_inplace_floor_divide;1090     binaryfunc nb_inplace_true_divide;10911092     /* Добавлено в версии 2.5 */1093     unaryfunc nb_index;1094} PyNumberMethods;1095```10961097Бинарные и тернарные функции могут получать аргументы разных типов в зависимости от бита флага [`Py_TPFLAGS_CHECKTYPES`](https://python-all.ru/2.6/c-api/typeobj.html#Py_TPFLAGS_CHECKTYPES):10981099- Если [`Py_TPFLAGS_CHECKTYPES`](https://python-all.ru/2.6/c-api/typeobj.html#Py_TPFLAGS_CHECKTYPES) не установлен, аргументы функции гарантированно принадлежат типу объекта; вызывающий код отвечает за вызов метода приведения, задаваемого членом [`nb_coerce`](https://python-all.ru/2.6/c-api/typeobj.html#nb_coerce), для преобразования аргументов:11001101  **coercion [PyNumberMethods](https://python-all.ru/2.6/c-api/typeobj.html#PyNumberMethods).`nb_coerce`**11021103  Эта функция используется [`PyNumber_CoerceEx()`](https://python-all.ru/2.6/c-api/number.html#PyNumber_CoerceEx) и имеет ту же сигнатуру. Первый аргумент всегда является указателем на объект заданного типа. Если возможно преобразование в общий «больший» тип, функция заменяет указатели новыми ссылками на преобразованные объекты и возвращает `0`. Если преобразование невозможно, функция возвращает `1`. Если установлено состояние ошибки, возвращается `-1`.1104- Если установлен флаг [`Py_TPFLAGS_CHECKTYPES`](https://python-all.ru/2.6/c-api/typeobj.html#Py_TPFLAGS_CHECKTYPES), бинарные и тернарные функции должны проверять тип всех своих операндов и выполнять необходимые преобразования (по крайней мере один из операндов является экземпляром заданного типа). Это рекомендуемый способ; в Python 3.0 приведение типов исчезнет полностью.11051106Если операция не определена для данных операндов, бинарные и тернарные функции должны вернуть `Py_NotImplemented`; если произошла другая ошибка, они должны вернуть `NULL` и установить исключение.11071108# Структуры объектов отображения11091110**`PyMappingMethods`**11111112Эта структура хранит указатели на функции, которые объект использует для реализации протокола отображения. Она содержит три члена:11131114**lenfunc [PyMappingMethods](https://python-all.ru/2.6/c-api/typeobj.html#PyMappingMethods).`mp_length`**11151116Эта функция используется функциями11171118[`PyMapping_Length()`](https://python-all.ru/2.6/c-api/mapping.html#PyMapping_Length)11191120и11211122[`PyObject_Size()`](https://python-all.ru/2.6/c-api/object.html#PyObject_Size)11231124и имеет ту же сигнатуру. Этот слот может быть установлен в11251126*NULL*11271128, если у объекта нет определённой длины.11291130**binaryfunc [PyMappingMethods](https://python-all.ru/2.6/c-api/typeobj.html#PyMappingMethods).`mp_subscript`**11311132Эта функция используется функцией11331134[`PyObject_GetItem()`](https://python-all.ru/2.6/c-api/object.html#PyObject_GetItem)11351136и имеет ту же сигнатуру. Этот слот должен быть заполнен, чтобы функция11371138[`PyMapping_Check()`](https://python-all.ru/2.6/c-api/mapping.html#PyMapping_Check)11391140возвращала11411142`1`11431144; в противном случае он может быть11451146*NULL*11471148.11491150**objobjargproc [PyMappingMethods](https://python-all.ru/2.6/c-api/typeobj.html#PyMappingMethods).`mp_ass_subscript`**11511152Эта функция используется функцией11531154[`PyObject_SetItem()`](https://python-all.ru/2.6/c-api/object.html#PyObject_SetItem)11551156и имеет ту же сигнатуру. Если этот слот равен11571158*NULL*11591160, объект не поддерживает присваивание по индексу.11611162# Структуры объектов последовательностей11631164**`PySequenceMethods`**11651166Эта структура содержит указатели на функции, которые объект использует для реализации протокола последовательности.11671168**lenfunc [PySequenceMethods](https://python-all.ru/2.6/c-api/typeobj.html#PySequenceMethods).`sq_length`**11691170Эта функция используется функциями11711172[`PySequence_Size()`](https://python-all.ru/2.6/c-api/sequence.html#PySequence_Size)11731174и11751176[`PyObject_Size()`](https://python-all.ru/2.6/c-api/object.html#PyObject_Size)11771178, и имеет ту же сигнатуру.11791180**binaryfunc [PySequenceMethods](https://python-all.ru/2.6/c-api/typeobj.html#PySequenceMethods).`sq_concat`**11811182Эта функция используется11831184[`PySequence_Concat()`](https://python-all.ru/2.6/c-api/sequence.html#PySequence_Concat)11851186и имеет ту же сигнатуру. Она также используется оператором11871188`+`11891190после попытки числового сложения через слот11911192`tp_as_number.nb_add`11931194.11951196**ssizeargfunc [PySequenceMethods](https://python-all.ru/2.6/c-api/typeobj.html#PySequenceMethods).`sq_repeat`**11971198Эта функция используется11991200[`PySequence_Repeat()`](https://python-all.ru/2.6/c-api/sequence.html#PySequence_Repeat)12011202и имеет ту же сигнатуру. Она также используется оператором12031204`*`12051206после попытки числового умножения через слот12071208`tp_as_number.nb_mul`12091210.12111212**ssizeargfunc [PySequenceMethods](https://python-all.ru/2.6/c-api/typeobj.html#PySequenceMethods).`sq_item`**12131214Эта функция используется функцией [`PySequence_GetItem()`](https://python-all.ru/2.6/c-api/sequence.html#PySequence_GetItem) и имеет ту же сигнатуру. Этот слот должен быть заполнен, чтобы функция [`PySequence_Check()`](https://python-all.ru/2.6/c-api/sequence.html#PySequence_Check) возвращала `1`; в противном случае он может быть *NULL*.12151216Отрицательные индексы обрабатываются следующим образом: если слот [`sq_length`](https://python-all.ru/2.6/c-api/typeobj.html#sq_length) заполнен, он вызывается, и длина последовательности используется для вычисления положительного индекса, который передаётся в [`sq_item`](https://python-all.ru/2.6/c-api/typeobj.html#sq_item). Если [`sq_length`](https://python-all.ru/2.6/c-api/typeobj.html#sq_length) равен *NULL*, индекс передаётся функции как есть.12171218**ssizeobjargproc [PySequenceMethods](https://python-all.ru/2.6/c-api/typeobj.html#PySequenceMethods).`sq_ass_item`**12191220Эта функция используется функцией12211222[`PySequence_SetItem()`](https://python-all.ru/2.6/c-api/sequence.html#PySequence_SetItem)12231224и имеет ту же сигнатуру. Этот слот может быть оставлен равным12251226*NULL*12271228, если объект не поддерживает присваивание по индексу.12291230**objobjproc [PySequenceMethods](https://python-all.ru/2.6/c-api/typeobj.html#PySequenceMethods).`sq_contains`**12311232Эта функция может использоваться12331234[`PySequence_Contains()`](https://python-all.ru/2.6/c-api/sequence.html#PySequence_Contains)12351236и имеет ту же\\nсигнатуру. Этот слот можно оставить равным12371238*NULL*12391240; в этом случае\\n12411242[`PySequence_Contains()`](https://python-all.ru/2.6/c-api/sequence.html#PySequence_Contains)12431244просто обходит последовательность, пока не найдёт\\nсовпадение.12451246**binaryfunc [PySequenceMethods](https://python-all.ru/2.6/c-api/typeobj.html#PySequenceMethods).`sq_inplace_concat`**12471248Эта функция используется12491250[`PySequence_InPlaceConcat()`](https://python-all.ru/2.6/c-api/sequence.html#PySequence_InPlaceConcat)12511252и имеет ту же\\nсигнатуру. Она должна изменить свой первый операнд и вернуть его.12531254**ssizeargfunc [PySequenceMethods](https://python-all.ru/2.6/c-api/typeobj.html#PySequenceMethods).`sq_inplace_repeat`**12551256Эта функция используется12571258[`PySequence_InPlaceRepeat()`](https://python-all.ru/2.6/c-api/sequence.html#PySequence_InPlaceRepeat)12591260и имеет ту же\\nсигнатуру. Она должна изменить свой первый операнд и вернуть его.12611262# Структуры объектов буфера12631264Буферный интерфейс предоставляет модель, в которой объект может раскрывать свои внутренние данные в виде набора блоков данных, где каждый блок задаётся парой указатель/длина. Эти блоки называются *сегментами* и предполагаются не смежными в памяти.12651266Если объект не предоставляет буферный интерфейс, то его поле [`tp_as_buffer`](https://python-all.ru/2.6/c-api/typeobj.html#tp_as_buffer) в структуре [`PyTypeObject`](https://python-all.ru/2.6/c-api/type.html#PyTypeObject) должно быть *NULL*. В противном случае [`tp_as_buffer`](https://python-all.ru/2.6/c-api/typeobj.html#tp_as_buffer) будет указывать на структуру [`PyBufferProcs`](https://python-all.ru/2.6/c-api/typeobj.html#PyBufferProcs).12671268> **Примечание**1269>1270> Очень важно, чтобы ваша структура [`PyTypeObject`](https://python-all.ru/2.6/c-api/type.html#PyTypeObject) использовала [`Py_TPFLAGS_DEFAULT`](https://python-all.ru/2.6/c-api/typeobj.html#Py_TPFLAGS_DEFAULT) в качестве значения члена [`tp_flags`](https://python-all.ru/2.6/c-api/typeobj.html#tp_flags), а не `0`. Это сообщает среде выполнения Python, что ваша структура [`PyBufferProcs`](https://python-all.ru/2.6/c-api/typeobj.html#PyBufferProcs) содержит слот `bf_getcharbuffer`. В старых версиях Python этого члена не было, поэтому новый интерпретатор Python, использующий старое расширение, должен иметь возможность проверить его наличие перед использованием.12711272**`PyBufferProcs`**12731274Структура, используемая для хранения указателей на функции, определяющие реализацию протокола буфера.12751276Первый слот – это `bf_getreadbuffer`, типа `getreadbufferproc`. Если этот слот равен *NULL*, то объект не поддерживает чтение из внутренних данных. Это бессмысленно, поэтому разработчики должны его заполнить, но вызывающие код должны проверять, что слот содержит не-*NULL* значение.12771278Следующий слот – `bf_getwritebuffer`, имеющий тип `getwritebufferproc`. Этот слот может быть *NULL*, если объект не разрешает запись в свои возвращаемые буферы.12791280Третий слот – `bf_getsegcount`, типа `getsegcountproc`. Этот слот не должен быть *NULL* и используется для информирования вызывающего о том, сколько сегментов содержит объект. Простые объекты, такие как [`PyString_Type`](https://python-all.ru/2.6/c-api/string.html#PyString_Type) и [`PyBuffer_Type`](https://python-all.ru/2.6/c-api/buffer.html#PyBuffer_Type), содержат один сегмент.12811282Последний слот – `bf_getcharbuffer`, типа `getcharbufferproc`. Этот слот будет присутствовать только в том случае, если флаг [`Py_TPFLAGS_HAVE_GETCHARBUFFER`](https://python-all.ru/2.6/c-api/typeobj.html#Py_TPFLAGS_HAVE_GETCHARBUFFER) присутствует в поле [`tp_flags`](https://python-all.ru/2.6/c-api/typeobj.html#tp_flags) объекта [`PyTypeObject`](https://python-all.ru/2.6/c-api/type.html#PyTypeObject). Перед использованием этого слота вызывающий должен проверить его наличие с помощью функции [`PyType_HasFeature()`](https://python-all.ru/2.6/c-api/type.html#PyType_HasFeature). Если флаг присутствует, `bf_getcharbuffer` может быть *NULL*, что означает, что содержимое объекта не может быть использовано как *8-битные символы*. Функция слота также может возбудить исключение, если содержимое объекта не может быть интерпретировано как 8-битные символы. Например, если объект является массивом, настроенным на хранение значений с плавающей запятой, исключение может быть возбуждено, если вызывающий попытается использовать `bf_getcharbuffer` для получения последовательности 8-битных символов. Это понятие экспорта внутренних буферов как «текста» используется для различения объектов, имеющих двоичную природу, и тех, которые содержат символьные данные.12831284> **Примечание**1285>1286> Текущая политика, по-видимому, утверждает, что эти символы могут быть многобайтовыми. Это означает, что размер буфера *N* не означает, что присутствует *N* символов.12871288#### `Py_TPFLAGS_HAVE_GETCHARBUFFER`12891290Бит флага, установленный в структуре типа, чтобы указать, что слот12911292`bf_getcharbuffer`12931294известен. Его установка не означает, что объект поддерживает интерфейс буфера или что слот12951296`bf_getcharbuffer`12971298не равен12991300*NULL*13011302.13031304**Py\_ssize\_t `(*readbufferproc)`([PyObject](https://python-all.ru/2.6/c-api/structures.html#PyObject) *\*self*, Py\_ssize\_t *segment*, void *\*\*ptrptr*)**13051306Возвращает указатель на читаемый сегмент буфера в13071308`*ptrptr`13091310. Эта функция может возбуждать исключение, и в этом случае она должна вернуть13111312`-1`13131314. Указанный13151316*segment*13171318должен быть неотрицательным и строго меньше количества сегментов, возвращаемых функцией слота13191320`bf_getsegcount`13211322. При успехе возвращает длину сегмента и устанавливает13231324`*ptrptr`13251326в указатель на эту память.13271328**Py\_ssize\_t `(*writebufferproc)`([PyObject](https://python-all.ru/2.6/c-api/structures.html#PyObject) *\*self*, Py\_ssize\_t *segment*, void *\*\*ptrptr*)**13291330Возвращает указатель на доступный для записи буфер памяти в13311332`*ptrptr`13331334и длину этого сегмента как возвращаемое значение функции. Буфер памяти должен соответствовать сегменту буфера13351336*segment*13371338. Должен вернуть13391340`-1`13411342и установить исключение при ошибке.13431344[`TypeError`](https://python-all.ru/2.6/library/exceptions.html#exceptions.TypeError)13451346должно быть возбуждено, если объект поддерживает только буферы только для чтения, и13471348[`SystemError`](https://python-all.ru/2.6/library/exceptions.html#exceptions.SystemError)13491350должно быть возбуждено, когда13511352*segment*13531354указывает сегмент, который не существует.13551356**Py\_ssize\_t `(*segcountproc)`([PyObject](https://python-all.ru/2.6/c-api/structures.html#PyObject) *\*self*, Py\_ssize\_t *\*lenp*)**13571358Возвращает количество сегментов памяти, составляющих буфер. Если13591360*lenp*13611362не равен13631364*NULL*13651366, реализация должна сообщить сумму размеров (в байтах) всех сегментов в13671368`*lenp`13691370. Функция не может завершиться ошибкой.13711372**Py\_ssize\_t `(*charbufferproc)`([PyObject](https://python-all.ru/2.6/c-api/structures.html#PyObject) *\*self*, Py\_ssize\_t *segment*, const char *\*\*ptrptr*)**13731374Возвращает размер сегмента13751376*segment*13771378, на который указывает13791380*ptrptr*13811382.13831384`*ptrptr`13851386устанавливается на буфер памяти. Возвращает13871388`-1`13891390при ошибке.1391