descriptor.md
1> **Источник:** https://python-all.ru/3.15/c-api/descriptor.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# Объекты дескрипторов89«Дескрипторы» – это объекты, описывающие некоторый атрибут объекта. Они находятся в словаре объектов типов.1011#### `PyObject *PyDescr_NewGetSet(PyTypeObject *type, struct PyGetSetDef *getset)`1213*Возвращаемое значение: новая ссылка.*1415*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*1617Создаёт новый дескриптор get-set для типа расширения *type* из структуры [`PyGetSetDef`](https://python-all.ru/3.15/c-api/structures.html#c.PyGetSetDef) *getset*.1819Дескрипторы 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).2021В случае успеха возвращает [сильную ссылку](https://python-all.ru/3.15/glossary.html#term-strong-reference) на дескриптор. При неудаче возвращает `NULL` с установленным исключением.2223#### `PyObject *PyDescr_NewMember(PyTypeObject *type, struct PyMemberDef *member)`2425*Возвращаемое значение: новая ссылка.*2627*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*2829Создаёт новый дескриптор элемента для типа расширения *type* из структуры [`PyMemberDef`](https://python-all.ru/3.15/c-api/structures.html#c.PyMemberDef) *member*.3031Дескрипторы элементов предоставляют поля 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).3233В случае успеха возвращает [сильную ссылку](https://python-all.ru/3.15/glossary.html#term-strong-reference) на дескриптор. При неудаче возвращает `NULL` с установленным исключением.3435#### `PyTypeObject PyMemberDescr_Type`3637*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*3839Объект типа для объектов дескрипторов элементов, созданных из структур [`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.4041#### `PyTypeObject PyGetSetDescr_Type`4243*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*4445Объект типа для объектов дескрипторов 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.4647#### `PyObject *PyDescr_NewMethod(PyTypeObject *type, struct PyMethodDef *meth)`4849*Возвращаемое значение: новая ссылка.*5051*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*5253Создаёт новый дескриптор метода для типа расширения *type* из структуры [`PyMethodDef`](https://python-all.ru/3.15/c-api/structures.html#c.PyMethodDef) *meth*.5455Дескрипторы методов предоставляют 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).5657В случае успеха возвращает [сильную ссылку](https://python-all.ru/3.15/glossary.html#term-strong-reference) на дескриптор. При неудаче возвращает `NULL` с установленным исключением.5859#### `PyTypeObject PyMethodDescr_Type`6061*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*6263Объект типа для объектов дескрипторов методов, созданных из структур [`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.6465#### `struct wrapperbase`6667Описывает обёртку слота (slot wrapper), используемую [`PyDescr_NewWrapper()`](https://python-all.ru/3.15/c-api/descriptor.html#c.PyDescr_NewWrapper).6869Каждая запись `wrapperbase` хранит видимое в Python имя и метаданные специального метода, реализованного слотом типа, вместе с функцией-обёрткой, используемой для адаптации этого слота к соглашению о вызовах Python.7071#### `PyObject *PyDescr_NewWrapper(PyTypeObject *type, struct wrapperbase *base, void *wrapped)`7273*Возвращаемое значение: новая ссылка.*7475Создаёт новый дескриптор-обёртку для типа расширения *type* из структуры [`wrapperbase`](https://python-all.ru/3.15/c-api/descriptor.html#c.wrapperbase) *base* и указателя на обёрнутую функцию слота *wrapped*.7677Дескрипторы-обёртки предоставляют специальные методы, реализованные слотами типов. Это тот же вид дескрипторов, который CPython создаёт для специальных методов на основе слотов, таких как `__repr__` или `__add__`, и в Python он представляется объектом [`types.WrapperDescriptorType`](https://python-all.ru/3.15/library/types.html#types.WrapperDescriptorType).7879В случае успеха возвращает [сильную ссылку](https://python-all.ru/3.15/glossary.html#term-strong-reference) на дескриптор. При неудаче возвращает `NULL` с установленным исключением.8081#### `PyTypeObject PyWrapperDescr_Type`8283*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*8485Объект типа для объектов дескрипторов-обёрток, создаваемых [`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).8687#### `PyObject *PyDescr_NewClassMethod(PyTypeObject *type, PyMethodDef *method)`8889*Возвращаемое значение: новая ссылка.*9091*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*9293Создаёт новый дескриптор метода класса для типа расширения *type* из структуры [`PyMethodDef`](https://python-all.ru/3.15/c-api/structures.html#c.PyMethodDef) *method*.9495Дескрипторы методов класса предоставляют доступ к 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).9697В случае успеха возвращает [сильную ссылку](https://python-all.ru/3.15/glossary.html#term-strong-reference) на дескриптор. При неудаче возвращает `NULL` с установленным исключением.9899#### `int PyDescr_IsData(PyObject *descr)`100101Возвращает ненулевое значение, если объект-дескриптор *descr* описывает атрибут данных, или `0`, если он описывает метод. *descr* должен быть объектом-дескриптором; проверка ошибок не выполняется.102103#### `PyObject *PyWrapper_New(PyObject *d, PyObject *self)`104105*Возвращаемое значение: новая ссылка.*106107*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*108109Создаёт новый связанный объект-обёртку из дескриптора-обёртки *d* и экземпляра *self*.110111Это связанная форма дескриптора-обёртки, создаваемого функцией [`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).112113В случае успеха возвращает [сильную ссылку](https://python-all.ru/3.15/glossary.html#term-strong-reference) на объект-обёртку. При неудаче возвращает `NULL` с установленным исключением.114115#### `PyDescr_COMMON`116117Это макрос, содержащий общие поля объекта-дескриптора.118119Это было включено в 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)).120121[Условно устарело](https://python-all.ru/3.15/glossary.html#term-soft-deprecated) с версии 3.15.122123## Встроенные дескрипторы124125#### `PyTypeObject PyProperty_Type`126127*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*128129Объект типа для объектов свойств. Это тот же объект, что и [`property`](https://python-all.ru/3.15/library/functions.html#property) в слое Python.130131#### `PyTypeObject PySuper_Type`132133*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*134135Объект типа для объектов super. Это тот же объект, что и [`super`](https://python-all.ru/3.15/library/functions.html#super) в слое Python.136137#### `PyTypeObject PyClassMethod_Type`138139Тип объектов методов класса. Это тот же объект, что и [`classmethod`](https://python-all.ru/3.15/library/functions.html#classmethod) в слое Python.140141#### `PyTypeObject PyClassMethodDescr_Type`142143*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*144145Объект типа для дескрипторов методов класса на уровне 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.146147#### `PyObject *PyClassMethod_New(PyObject *callable)`148149Создаёт новый объект [`classmethod`](https://python-all.ru/3.15/library/functions.html#classmethod), оборачивающий *callable*. *callable* должен быть вызываемым объектом и не должен быть `NULL`.150151В случае успеха эта функция возвращает [сильную ссылку](https://python-all.ru/3.15/glossary.html#term-strong-reference) на новый дескриптор метода класса. При неудаче возвращает `NULL` с установленным исключением.152153#### `PyTypeObject PyStaticMethod_Type`154155Тип объектов статических методов. Это тот же объект, что и [`staticmethod`](https://python-all.ru/3.15/library/functions.html#staticmethod) в слое Python.156157#### `PyObject *PyStaticMethod_New(PyObject *callable)`158159Создаёт новый объект [`staticmethod`](https://python-all.ru/3.15/library/functions.html#staticmethod), оборачивающий *callable*. *callable* должен быть вызываемым объектом и не должен быть `NULL`.160161В случае успеха эта функция возвращает [сильную ссылку](https://python-all.ru/3.15/glossary.html#term-strong-reference) на новый дескриптор статического метода. При неудаче возвращает `NULL` с установленным исключением.162