This document is for an old version of Python that is no longer supported. You should upgrade, and read the Python documentation for the current stable release.

# Об’єкти типу

`PyTypeObject`

  Структура C об’єктів, що використовуються для опису вбудованих типів.

PyTypeObject `PyType_Type`

  Це об’єкт типу для об’єктів типу; це той самий об’єкт, що й `type` на рівні Python.

int `PyType_Check`(PyObject *o)

  Повертає ненульове значення, якщо об’єкт o є об’єктом типу, включаючи екземпляри типів, похідних від об’єкта стандартного типу. Повертає 0 у всіх інших випадках. Ця функція завжди успішна.

int `PyType_CheckExact`(PyObject *o)

  Повертає відмінне від нуля значення, якщо об’єкт o є об’єктом типу, але не підтипом об’єкта стандартного типу. Повертає 0 у всіх інших випадках. Ця функція завжди успішна.

unsigned int `PyType_ClearCache`()

  Очистіть внутрішній кеш пошуку. Повернути тег поточної версії.

unsigned long `PyType_GetFlags`(PyTypeObject* type)

  Return the `tp_flags` member of type. This function is primarily meant for use with Py_LIMITED_API; the individual flag bits are guaranteed to be stable across Python releases, but access to `tp_flags` itself is not part of the limited API.

  Нове в версії 3.2.

  Змінено в версії 3.4: Тип повернення тепер `unsigned long`, а не `long`.

void `PyType_Modified`(PyTypeObject *type)

  Визнати недійсним внутрішній кеш пошуку для типу та всіх його підтипів. Цю функцію необхідно викликати після будь-якої ручної зміни атрибутів або базових класів типу.

int `PyType_HasFeature`(PyTypeObject *o, int feature)

  Повертає ненульове значення, якщо об’єкт типу o встановлює функцію feature. Функції типу позначаються однобітовими прапорцями.

int `PyType_IS_GC`(PyTypeObject *o)

  Return true if the type object includes support for the cycle detector; this tests the type flag `Py_TPFLAGS_HAVE_GC`.

int `PyType_IsSubtype`(PyTypeObject *a, PyTypeObject *b)

  Повертає true, якщо a є підтипом b.

  This function only checks for actual subtypes, which means that `__subclasscheck__()` is not called on b. Call `PyObject_IsSubclass()` to do the same check that `issubclass()` would do.

PyObject* `PyType_GenericAlloc`(PyTypeObject *type, Py_ssize_t nitems)
  Return value: New reference.

  Загальний обробник для слота `tp_alloc` об’єкта типу. Використовуйте стандартний механізм виділення пам’яті Python, щоб виділити новий екземпляр та ініціалізувати весь його вміст як `NULL`.

PyObject* `PyType_GenericNew`(PyTypeObject *type, PyObject *args, PyObject *kwds)
  Return value: New reference.

  Загальний обробник для слота `tp_new` об’єкта типу. Створіть новий екземпляр, використовуючи слот типу `tp_alloc`.

int `PyType_Ready`(PyTypeObject *type)

  Завершення об’єкта типу. Це слід викликати для всіх об’єктів типу, щоб завершити їх ініціалізацію. Ця функція відповідає за додавання успадкованих слотів від базового класу типу. Повертає `0` у разі успіху або `-1` і встановлює виняток у випадку помилки.

  Примітка

  If some of the base classes implements the GC protocol and the provided type does not include the `Py_TPFLAGS_HAVE_GC` in its flags, then the GC protocol will be automatically implemented from its parents. On the contrary, if the type being created does include `Py_TPFLAGS_HAVE_GC` in its flags then it must implement the GC protocol itself by at least implementing the `tp_traverse` handle.

void* `PyType_GetSlot`(PyTypeObject *type, int slot)

  Повертає вказівник функції, що зберігається у вказаному слоті. Якщо результат `NULL`, це означає, що або слот має `NULL`, або що функцію було викликано з недійсними параметрами. Викликачі зазвичай перетворюють покажчик результату на відповідний тип функції.

  Перегляньте `PyType_Slot.slot`, щоб дізнатися про можливі значення аргументу slot.

  An exception is raised if type is not a heap type.

  Нове в версії 3.4.

PyObject* `PyType_GetModule`(PyTypeObject *type)

  Повертає об’єкт модуля, пов’язаний із заданим типом, коли тип було створено за допомогою `PyType_FromModuleAndSpec()`.

  Якщо жоден модуль не пов’язаний із заданим типом, встановлюється `TypeError` і повертається `NULL`.

  This function is usually used to get the module in which a method is defined. Note that in such a method, `PyType_GetModule(Py_TYPE(self))` may not return the intended result. `Py_TYPE(self)` may be a subclass of the intended class, and subclasses are not necessarily defined in the same module as their superclass. See `PyCMethod` to get the class that defines the method.

  Нове в версії 3.9.

void* `PyType_GetModuleState`(PyTypeObject *type)

  Повертає стан об’єкта модуля, пов’язаного з заданим типом. Це ярлик для виклику `PyModule_GetState()` за результатом `PyType_GetModule()`.

  Якщо жоден модуль не пов’язаний із заданим типом, встановлюється `TypeError` і повертається `NULL`.

  Якщо тип має пов’язаний модуль, але його стан `NULL`, повертає `NULL` без встановлення винятку.

  Нове в версії 3.9.

## Створення типів, виділених у купі

Наступні функції та структури використовуються для створення типів купи.

PyObject* `PyType_FromModuleAndSpec`(PyObject *module, PyType_Spec *spec, PyObject *bases)
  Return value: New reference.

  Creates and returns a heap type object from the spec (`Py_TPFLAGS_HEAPTYPE`).

  If bases is a tuple, the created heap type contains all types contained in it as base types.

  If bases is `NULL`, the Py_tp_bases slot is used instead. If that also is `NULL`, the Py_tp_base slot is used instead. If that also is `NULL`, the new type derives from `object`.

  Аргумент module можна використовувати для запису модуля, в якому визначено новий клас. Це має бути об’єкт модуля або `NULL`. Якщо не `NULL`, модуль асоціюється з новим типом і може бути пізніше отриманий за допомогою `PyType_GetModule()`. Асоційований модуль не успадковується підкласами; її необхідно вказувати для кожного класу окремо.

  Ця функція викликає `PyType_Ready()` для нового типу.

  Нове в версії 3.9.

PyObject* `PyType_FromSpecWithBases`(PyType_Spec *spec, PyObject *bases)
  Return value: New reference.

  Equivalent to `PyType_FromModuleAndSpec(NULL, spec, bases)`.

  Нове в версії 3.3.

PyObject* `PyType_FromSpec`(PyType_Spec *spec)
  Return value: New reference.

  Equivalent to `PyType_FromSpecWithBases(spec, NULL)`.

`PyType_Spec`

  Структура, що визначає поведінку типу.

  const char* `PyType_Spec.name`

    Назва типу, що використовується для встановлення `PyTypeObject.tp_name`.

  int `PyType_Spec.basicsize`
  int `PyType_Spec.itemsize`

    Size of the instance in bytes, used to set `PyTypeObject.tp_basicsize` and `PyTypeObject.tp_itemsize`.

  int `PyType_Spec.flags`

    Прапорці типу, які використовуються для встановлення `PyTypeObject.tp_flags`.

    Якщо прапор `Py_TPFLAGS_HEAPTYPE` не встановлено, `PyType_FromSpecWithBases()` встановлює його автоматично.

  PyType_Slot *`PyType_Spec.slots`

    Масив структур `PyType_Slot`. Закінчується спеціальним значенням слота `{0, NULL}`.

`PyType_Slot`

  Структура, що визначає необов’язкову функціональність типу, що містить ідентифікатор слота та покажчик значення.

  int `PyType_Slot.slot`

    > Ідентифікатор слота.

    > Ідентифікатори слотів називаються як імена полів структур `PyTypeObject`, `PyNumberMethods`, `PySequenceMethods`, `PyMappingMethods` і `PyAsyncMethods` з доданим префіксом `Py_`. Наприклад, використовуйте:

    > - `Py_tp_dealloc` для встановлення `PyTypeObject.tp_dealloc`

    > - `Py_nb_add` для встановлення `PyNumberMethods.nb_add`

    > - `Py_sq_length` для встановлення `PySequenceMethods.sq_length`

    > The following fields cannot be set at all using `PyType_Spec` and `PyType_Slot`:

    > - `tp_dict`

    > - `tp_mro`

    > - `tp_cache`

    > - `tp_subclasses`

    > - `tp_weaklist`

    > - `tp_vectorcall`

    > - `tp_weaklistoffset` (see PyMemberDef)

    > - `tp_dictoffset` (see PyMemberDef)

    > - `tp_vectorcall_offset` (see PyMemberDef)

    > The following fields cannot be set using `PyType_Spec` and `PyType_Slot` under the limited API:

    > - `bf_getbuffer`

    > - `bf_releasebuffer`

    > Setting `Py_tp_bases` or `Py_tp_base` may be problematic on some platforms. To avoid issues, use the bases argument of `PyType_FromSpecWithBases()` instead.

    Змінено в версії 3.9: Слоти в `PyBufferProcs` можна встановити в необмеженому API.

  void *`PyType_Slot.pfunc`

    Бажане значення слота. У більшості випадків це вказівник на функцію.

    May not be `NULL`.