> **Источник:** https://python-all.ru/3.15/c-api/descriptor.html
>
> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.

---

# Объекты дескрипторов

«Дескрипторы» – это объекты, описывающие некоторый атрибут объекта. Они находятся в словаре объектов типов.

#### `PyObject *PyDescr_NewGetSet(PyTypeObject *type, struct PyGetSetDef *getset)`

*Возвращаемое значение: новая ссылка.*

*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*

Создаёт новый дескриптор get-set для типа расширения *type* из структуры [`PyGetSetDef`](https://python-all.ru/3.15/c-api/structures.html#c.PyGetSetDef) *getset*.

Дескрипторы get-set предоставляют доступ к атрибутам, реализованным через C-функции получения и установки, а не хранящимся напрямую в экземпляре. Это тот же вид дескрипторов, который создаётся для записей в [`tp_getset`](https://python-all.ru/3.15/c-api/typeobj.html#c.PyTypeObject.tp_getset), и в Python он представляется объектом [`types.GetSetDescriptorType`](https://python-all.ru/3.15/library/types.html#types.GetSetDescriptorType).

В случае успеха возвращает [сильную ссылку](https://python-all.ru/3.15/glossary.html#term-strong-reference) на дескриптор. При неудаче возвращает `NULL` с установленным исключением.

#### `PyObject *PyDescr_NewMember(PyTypeObject *type, struct PyMemberDef *member)`

*Возвращаемое значение: новая ссылка.*

*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*

Создаёт новый дескриптор элемента для типа расширения *type* из структуры [`PyMemberDef`](https://python-all.ru/3.15/c-api/structures.html#c.PyMemberDef) *member*.

Дескрипторы элементов предоставляют поля C-структуры типа как атрибуты Python. Это тот же вид дескрипторов, который создаётся для записей в [`tp_members`](https://python-all.ru/3.15/c-api/typeobj.html#c.PyTypeObject.tp_members), и в Python он представляется объектом [`types.MemberDescriptorType`](https://python-all.ru/3.15/library/types.html#types.MemberDescriptorType).

В случае успеха возвращает [сильную ссылку](https://python-all.ru/3.15/glossary.html#term-strong-reference) на дескриптор. При неудаче возвращает `NULL` с установленным исключением.

#### `PyTypeObject PyMemberDescr_Type`

*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*

Объект типа для объектов дескрипторов элементов, созданных из структур [`PyMemberDef`](https://python-all.ru/3.15/c-api/structures.html#c.PyMemberDef). Эти дескрипторы предоставляют поля C-структуры как атрибуты типа и соответствуют объектам [`types.MemberDescriptorType`](https://python-all.ru/3.15/library/types.html#types.MemberDescriptorType) в Python.

#### `PyTypeObject PyGetSetDescr_Type`

*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*

Объект типа для объектов дескрипторов get/set, созданных из структур [`PyGetSetDef`](https://python-all.ru/3.15/c-api/structures.html#c.PyGetSetDef). Эти дескрипторы реализуют атрибуты, значение которых вычисляется C-функциями получения и установки, и используются для многих встроенных атрибутов типов. Они соответствуют объектам [`types.GetSetDescriptorType`](https://python-all.ru/3.15/library/types.html#types.GetSetDescriptorType) в Python.

#### `PyObject *PyDescr_NewMethod(PyTypeObject *type, struct PyMethodDef *meth)`

*Возвращаемое значение: новая ссылка.*

*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*

Создаёт новый дескриптор метода для типа расширения *type* из структуры [`PyMethodDef`](https://python-all.ru/3.15/c-api/structures.html#c.PyMethodDef) *meth*.

Дескрипторы методов предоставляют C-функции как методы типа. Это тот же вид дескрипторов, который создаётся для записей в [`tp_methods`](https://python-all.ru/3.15/c-api/typeobj.html#c.PyTypeObject.tp_methods), и в Python он представляется объектом [`types.MethodDescriptorType`](https://python-all.ru/3.15/library/types.html#types.MethodDescriptorType).

В случае успеха возвращает [сильную ссылку](https://python-all.ru/3.15/glossary.html#term-strong-reference) на дескриптор. При неудаче возвращает `NULL` с установленным исключением.

#### `PyTypeObject PyMethodDescr_Type`

*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*

Объект типа для объектов дескрипторов методов, созданных из структур [`PyMethodDef`](https://python-all.ru/3.15/c-api/structures.html#c.PyMethodDef). Эти дескрипторы предоставляют C-функции как методы типа и соответствуют объектам [`types.MethodDescriptorType`](https://python-all.ru/3.15/library/types.html#types.MethodDescriptorType) в Python.

#### `struct wrapperbase`

Описывает обёртку слота (slot wrapper), используемую [`PyDescr_NewWrapper()`](https://python-all.ru/3.15/c-api/descriptor.html#c.PyDescr_NewWrapper).

Каждая запись `wrapperbase` хранит видимое в Python имя и метаданные специального метода, реализованного слотом типа, вместе с функцией-обёрткой, используемой для адаптации этого слота к соглашению о вызовах Python.

#### `PyObject *PyDescr_NewWrapper(PyTypeObject *type, struct wrapperbase *base, void *wrapped)`

*Возвращаемое значение: новая ссылка.*

Создаёт новый дескриптор-обёртку для типа расширения *type* из структуры [`wrapperbase`](https://python-all.ru/3.15/c-api/descriptor.html#c.wrapperbase) *base* и указателя на обёрнутую функцию слота *wrapped*.

Дескрипторы-обёртки предоставляют специальные методы, реализованные слотами типов. Это тот же вид дескрипторов, который CPython создаёт для специальных методов на основе слотов, таких как `__repr__` или `__add__`, и в Python он представляется объектом [`types.WrapperDescriptorType`](https://python-all.ru/3.15/library/types.html#types.WrapperDescriptorType).

В случае успеха возвращает [сильную ссылку](https://python-all.ru/3.15/glossary.html#term-strong-reference) на дескриптор. При неудаче возвращает `NULL` с установленным исключением.

#### `PyTypeObject PyWrapperDescr_Type`

*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*

Объект типа для объектов дескрипторов-обёрток, создаваемых [`PyDescr_NewWrapper()`](https://python-all.ru/3.15/c-api/descriptor.html#c.PyDescr_NewWrapper) и [`PyWrapper_New()`](https://python-all.ru/3.15/c-api/descriptor.html#c.PyWrapper_New). Дескрипторы-обёртки используются внутри для предоставления специальных методов, реализованных через структуры-обёртки, и в Python представляются объектами [`types.WrapperDescriptorType`](https://python-all.ru/3.15/library/types.html#types.WrapperDescriptorType).

#### `PyObject *PyDescr_NewClassMethod(PyTypeObject *type, PyMethodDef *method)`

*Возвращаемое значение: новая ссылка.*

*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*

Создаёт новый дескриптор метода класса для типа расширения *type* из структуры [`PyMethodDef`](https://python-all.ru/3.15/c-api/structures.html#c.PyMethodDef) *method*.

Дескрипторы методов класса предоставляют доступ к C-методам, которые при обращении получают класс, а не экземпляр. Это тот же вид дескрипторов, что создаётся для записей `METH_CLASS` в [`tp_methods`](https://python-all.ru/3.15/c-api/typeobj.html#c.PyTypeObject.tp_methods), и в Python он представлен объектом [`types.ClassMethodDescriptorType`](https://python-all.ru/3.15/library/types.html#types.ClassMethodDescriptorType).

В случае успеха возвращает [сильную ссылку](https://python-all.ru/3.15/glossary.html#term-strong-reference) на дескриптор. При неудаче возвращает `NULL` с установленным исключением.

#### `int PyDescr_IsData(PyObject *descr)`

Возвращает ненулевое значение, если объект-дескриптор *descr* описывает атрибут данных, или `0`, если он описывает метод. *descr* должен быть объектом-дескриптором; проверка ошибок не выполняется.

#### `PyObject *PyWrapper_New(PyObject *d, PyObject *self)`

*Возвращаемое значение: новая ссылка.*

*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*

Создаёт новый связанный объект-обёртку из дескриптора-обёртки *d* и экземпляра *self*.

Это связанная форма дескриптора-обёртки, создаваемого функцией [`PyDescr_NewWrapper()`](https://python-all.ru/3.15/c-api/descriptor.html#c.PyDescr_NewWrapper). CPython создаёт такие объекты, когда к слотовой обёртке обращаются через экземпляр; в Python они представлены объектами [`types.MethodWrapperType`](https://python-all.ru/3.15/library/types.html#types.MethodWrapperType).

В случае успеха возвращает [сильную ссылку](https://python-all.ru/3.15/glossary.html#term-strong-reference) на объект-обёртку. При неудаче возвращает `NULL` с установленным исключением.

#### `PyDescr_COMMON`

Это макрос, содержащий общие поля объекта-дескриптора.

Это было включено в C API Python по ошибке; не используйте это в расширениях. Для создания пользовательских объектов-дескрипторов создайте класс, реализующий протокол дескрипторов ([`tp_descr_get`](https://python-all.ru/3.15/c-api/typeobj.html#c.PyTypeObject.tp_descr_get) и [`tp_descr_set`](https://python-all.ru/3.15/c-api/typeobj.html#c.PyTypeObject.tp_descr_set)).

[Условно устарело](https://python-all.ru/3.15/glossary.html#term-soft-deprecated) с версии 3.15.

## Встроенные дескрипторы

#### `PyTypeObject PyProperty_Type`

*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*

Объект типа для объектов свойств. Это тот же объект, что и [`property`](https://python-all.ru/3.15/library/functions.html#property) в слое Python.

#### `PyTypeObject PySuper_Type`

*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*

Объект типа для объектов super. Это тот же объект, что и [`super`](https://python-all.ru/3.15/library/functions.html#super) в слое Python.

#### `PyTypeObject PyClassMethod_Type`

Тип объектов методов класса. Это тот же объект, что и [`classmethod`](https://python-all.ru/3.15/library/functions.html#classmethod) в слое Python.

#### `PyTypeObject PyClassMethodDescr_Type`

*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*

Объект типа для дескрипторов методов класса на уровне C. Это тип дескрипторов, создаваемых для [`classmethod()`](https://python-all.ru/3.15/library/functions.html#classmethod), определённых в типах расширений на C, и соответствует объектам [`types.ClassMethodDescriptorType`](https://python-all.ru/3.15/library/types.html#types.ClassMethodDescriptorType) в Python.

#### `PyObject *PyClassMethod_New(PyObject *callable)`

Создаёт новый объект [`classmethod`](https://python-all.ru/3.15/library/functions.html#classmethod), оборачивающий *callable*. *callable* должен быть вызываемым объектом и не должен быть `NULL`.

В случае успеха эта функция возвращает [сильную ссылку](https://python-all.ru/3.15/glossary.html#term-strong-reference) на новый дескриптор метода класса. При неудаче возвращает `NULL` с установленным исключением.

#### `PyTypeObject PyStaticMethod_Type`

Тип объектов статических методов. Это тот же объект, что и [`staticmethod`](https://python-all.ru/3.15/library/functions.html#staticmethod) в слое Python.

#### `PyObject *PyStaticMethod_New(PyObject *callable)`

Создаёт новый объект [`staticmethod`](https://python-all.ru/3.15/library/functions.html#staticmethod), оборачивающий *callable*. *callable* должен быть вызываемым объектом и не должен быть `NULL`.

В случае успеха эта функция возвращает [сильную ссылку](https://python-all.ru/3.15/glossary.html#term-strong-reference) на новый дескриптор статического метода. При неудаче возвращает `NULL` с установленным исключением.
