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

---

# Протокол объектов

**\[PyObject\_Print\]int `PyObject_Print`([PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject) *\*o*, FILE *\*fp*, int *flags*)**

Выводит объект

*o*

в файл

*fp*

. Возвращает

`-1`

в случае ошибки. Аргумент flags используется для включения определённых опций вывода. Единственная поддерживаемая в настоящее время опция –

`Py_PRINT_RAW`

; если она указана, выводится

[`str()`](https://python-all.ru/3.0/library/functions.html#str)

объекта вместо

[`repr()`](https://python-all.ru/3.0/library/functions.html#repr)

.

**\[PyObject\_HasAttr\]int `PyObject_HasAttr`([PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject) *\*o*, [PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject) *\*attr\_name*)**

Возвращает

`1`

, если

*o*

имеет атрибут

*attr\_name*

, и

`0`

в противном случае. Это эквивалентно выражению Python

`hasattr(o, attr_name)`

. Эта функция всегда завершается успешно.

**\[PyObject\_HasAttrString\]int `PyObject_HasAttrString`([PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject) *\*o*, const char *\*attr\_name*)**

Возвращает

`1`

, если

*o*

имеет атрибут

*attr\_name*

, и

`0`

в противном случае. Это эквивалентно выражению Python

`hasattr(o, attr_name)`

. Эта функция всегда завершается успешно.

**\[PyObject\_GetAttr\][PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject)\* `PyObject_GetAttr`([PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject) *\*o*, [PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject) *\*attr\_name*)**

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

Извлекает атрибут с именем *attr\_name* из объекта *o*. Возвращает значение атрибута при успехе или *NULL* при неудаче. Это эквивалент выражения Python `o.attr_name`.

**\[PyObject\_GetAttrString\][PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject)\* `PyObject_GetAttrString`([PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject) *\*o*, const char *\*attr\_name*)**

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

Извлекает атрибут с именем *attr\_name* из объекта *o*. Возвращает значение атрибута при успехе или *NULL* при неудаче. Это эквивалент выражения Python `o.attr_name`.

**\[PyObject\_SetAttr\]int `PyObject_SetAttr`([PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject) *\*o*, [PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject) *\*attr\_name*, [PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject) *\*v*)**

Устанавливает значение атрибута с именем

*attr\_name*

для объекта

*o*

равным

*v*

. Возвращает

`-1`

при неудаче. Это эквивалент оператора Python

`o.attr_name = v`

.

**\[PyObject\_SetAttrString\]int `PyObject_SetAttrString`([PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject) *\*o*, const char *\*attr\_name*, [PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject) *\*v*)**

Устанавливает значение атрибута с именем

*attr\_name*

для объекта

*o*

равным

*v*

. Возвращает

`-1`

при неудаче. Это эквивалент оператора Python

`o.attr_name = v`

.

**\[PyObject\_DelAttr\]int `PyObject_DelAttr`([PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject) *\*o*, [PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject) *\*attr\_name*)**

Удаляет атрибут с именем

*attr\_name*

для объекта

*o*

. Возвращает

`-1`

при неудаче. Это эквивалент оператора Python

`del o.attr_name`

.

**\[PyObject\_DelAttrString\]int `PyObject_DelAttrString`([PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject) *\*o*, const char *\*attr\_name*)**

Удаляет атрибут с именем

*attr\_name*

для объекта

*o*

. Возвращает

`-1`

при неудаче. Это эквивалент оператора Python

`del o.attr_name`

.

**\[PyObject\_RichCompare\][PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject)\* `PyObject_RichCompare`([PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject) *\*o1*, [PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject) *\*o2*, int *opid*)**

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

Сравнивает значения *o1* и *o2* с помощью операции, заданной *opid*, которая должна быть одной из `Py_LT`, `Py_LE`, `Py_EQ`, `Py_NE`, `Py_GT` или `Py_GE`, что соответствует `<`, `<=`, `==`, `!=`, `>` или `>=` соответственно. Это эквивалент выражения Python `o1 op o2`, где `op` – оператор, соответствующий *opid*. Возвращает результат сравнения в случае успеха или *NULL* при ошибке.

**\[PyObject\_RichCompareBool\]int `PyObject_RichCompareBool`([PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject) *\*o1*, [PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject) *\*o2*, int *opid*)**

Сравнивает значения

*o1*

и

*o2*

с помощью операции, заданной

*opid*

, которая должна быть одной из

`Py_LT`

,

`Py_LE`

,

`Py_EQ`

,

`Py_NE`

,

`Py_GT`

или

`Py_GE`

, что соответствует

`<`

,

`<=`

,

`==`

,

`!=`

,

`>`

или

`>=`

соответственно. Возвращает

`-1`

при ошибке,

`0`

если результат ложный,

`1`

в противном случае. Это эквивалент выражения Python

`o1 op o2`

, где

`op`

– оператор, соответствующий

*opid*

.

**\[PyObject\_Repr\][PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject)\* `PyObject_Repr`([PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject) *\*o*)**

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

Вычисляет строковое представление объекта *o*. Возвращает строковое представление в случае успеха или *NULL* при ошибке. Это эквивалент выражения Python `repr(o)`. Вызывается встроенной функцией [`repr()`](https://python-all.ru/3.0/library/functions.html#repr).

**\[PyObject\_ASCII\][PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject)\* `PyObject_ASCII`([PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject) *\*o*)**

Как и [`PyObject_Repr`](https://python-all.ru/3.0/c-api/object.html#PyObject_Repr), вычисляет строковое представление объекта *o*, но экранирует не-ASCII символы в строке, возвращаемой [`PyObject_Repr`](https://python-all.ru/3.0/c-api/object.html#PyObject_Repr), с помощью `\x`, `\u` или `\U`. В результате получается строка, похожая на возвращаемую [`PyObject_Repr`](https://python-all.ru/3.0/c-api/object.html#PyObject_Repr) в Python 2. Вызывается встроенной функцией [`ascii()`](https://python-all.ru/3.0/library/functions.html#ascii).

**\[PyObject\_Str\][PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject)\* `PyObject_Str`([PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject) *\*o*)**

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

Вычисляет строковое представление объекта *o*. Возвращает строковое представление в случае успеха или *NULL* при ошибке. Это эквивалент выражения Python `str(o)`. Вызывается встроенной функцией [`str()`](https://python-all.ru/3.0/library/functions.html#str) и, следовательно, функцией [`print()`](https://python-all.ru/3.0/library/functions.html#print).

**\[PyObject\_Bytes\][PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject)\* `PyObject_Bytes`([PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject) *\*o*)**

Вычисляет байтовое представление объекта *o*. *NULL* возвращается при ошибке и объект bytes при успехе. Это эквивалентно выражению Python `bytes(o)`.

**\[PyObject\_IsInstance\]int `PyObject_IsInstance`([PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject) *\*inst*, [PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject) *\*cls*)**

Возвращает

`1`

, если

*inst*

является экземпляром класса

*cls*

или подкласса

*cls*

, и

`0`

в противном случае. При ошибке возвращает

`-1`

и устанавливает исключение. Если

*cls*

– объект-тип, а не объект-класс, то

[`PyObject_IsInstance`](https://python-all.ru/3.0/c-api/object.html#PyObject_IsInstance)

возвращает

`1`

, если

*inst*

имеет тип

*cls*

. Если

*cls*

– кортеж, проверка выполняется для каждого элемента

*cls*

. Результат будет

`1`

, когда хотя бы одна проверка вернёт

`1`

, иначе

`0`

. Если

*inst*

не является экземпляром класса, а

*cls*

не является ни объектом-типом, ни объектом-классом, ни кортежем, то

*inst*

должен иметь атрибут

`__class__`

– отношение классов значения этого атрибута к

*cls*

будет использовано для определения результата этой функции.

Определение подкласса выполняется довольно прямолинейно, но содержит одну особенность, о которой разработчикам расширений системы классов стоит знать. Если `A` и `B` – объекты-классы, то `B` является подклассом `A`, если он наследует от `A` прямо или косвенно. Если хотя бы один из них не является объектом-классом, применяется более общий механизм для определения отношения классов двух объектов. При проверке, является ли *B* подклассом *A*, если *A* равно *B*, то [`PyObject_IsSubclass`](https://python-all.ru/3.0/c-api/object.html#PyObject_IsSubclass) возвращает истину. Если *A* и *B* – разные объекты, то атрибут *B*‘s `__bases__` ищется в глубину для *A* – наличие атрибута `__bases__` считается достаточным для этого определения.

**\[PyObject\_IsSubclass\]int `PyObject_IsSubclass`([PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject) *\*derived*, [PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject) *\*cls*)**

Возвращает

`1`

, если класс

*derived*

идентичен классу

*cls*

или наследуется от него, иначе возвращает

`0`

. В случае ошибки возвращает

`-1`

. Если

*cls*

является кортежем, проверка будет выполнена для каждого элемента

*cls*

. Результат будет

`1`

, когда хотя бы одна из проверок возвращает

`1`

, иначе

`0`

. Если

*derived*

или

*cls*

не являются реальными объектами классов (или кортежем), эта функция использует описанный выше общий алгоритм.

**\[PyCallable\_Check\]int `PyCallable_Check`([PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject) *\*o*)**

Определяет, является ли объект

*o*

вызываемым. Возвращает

`1`

, если объект вызываем, и

`0`

в противном случае. Эта функция всегда завершается успешно.

**\[PyObject\_Call\][PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject)\* `PyObject_Call`([PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject) *\*callable\_object*, [PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject) *\*args*, [PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject) *\*kw*)**

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

Вызывает вызываемый объект Python *callable\_object* с аргументами, заданными кортежем *args*, и именованными аргументами, заданными словарём *kw*. Если именованные аргументы не нужны, *kw* может быть *NULL*. *args* не должен быть *NULL*; если аргументы не нужны, используйте пустой кортеж. Возвращает результат вызова в случае успеха или *NULL* при ошибке. Это эквивалент выражения Python `callable_object(*args, **kw)`.

**\[PyObject\_CallObject\][PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject)\* `PyObject_CallObject`([PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject) *\*callable\_object*, [PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject) *\*args*)**

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

Вызывает вызываемый объект Python *callable\_object* с аргументами, заданными кортежем *args*. Если аргументы не нужны, то *args* может быть *NULL*. Возвращает результат вызова в случае успеха или *NULL* при ошибке. Это эквивалент выражения Python `callable_object(*args)`.

**\[PyObject\_CallFunction\][PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject)\* `PyObject_CallFunction`([PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject) *\*callable*, char *\*format*, ...)**

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

Вызывает вызываемый объект Python *callable* с переменным количеством аргументов C. Аргументы C описываются строкой формата в стиле [`Py_BuildValue`](https://python-all.ru/3.0/c-api/arg.html#Py_BuildValue). Формат может быть *NULL*, что означает отсутствие аргументов. Возвращает результат вызова в случае успеха или *NULL* при неудаче. Это эквивалент выражения Python `callable(*args)`. Обратите внимание: если передаются только аргументы [`PyObject *`](https://python-all.ru/3.0/c-api/structures.html#PyObject), то более быстрой альтернативой является [`PyObject_CallFunctionObjArgs`](https://python-all.ru/3.0/c-api/object.html#PyObject_CallFunctionObjArgs).

**\[PyObject\_CallMethod\][PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject)\* `PyObject_CallMethod`([PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject) *\*o*, char *\*method*, char *\*format*, ...)**

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

Вызывает метод с именем *method* объекта *o* с переменным количеством аргументов C. Аргументы C описываются строкой формата в стиле [`Py_BuildValue`](https://python-all.ru/3.0/c-api/arg.html#Py_BuildValue), которая должна создавать кортеж. Формат может быть *NULL*, что означает отсутствие аргументов. Возвращает результат вызова в случае успеха или *NULL* при неудаче. Это эквивалент выражения Python `o.method(args)`. Обратите внимание: если передаются только аргументы [`PyObject *`](https://python-all.ru/3.0/c-api/structures.html#PyObject), то более быстрой альтернативой является [`PyObject_CallMethodObjArgs`](https://python-all.ru/3.0/c-api/object.html#PyObject_CallMethodObjArgs).

**\[PyObject\_CallFunctionObjArgs\][PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject)\* `PyObject_CallFunctionObjArgs`([PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject) *\*callable*, ..., NULL)**

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

Вызывает вызываемый объект Python *callable* с переменным числом аргументов типа [`PyObject*`](https://python-all.ru/3.0/c-api/structures.html#PyObject). Аргументы передаются как переменное число параметров, за которыми следует *NULL*. Возвращает результат вызова в случае успеха или *NULL* при ошибке.

**\[PyObject\_CallMethodObjArgs\][PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject)\* `PyObject_CallMethodObjArgs`([PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject) *\*o*, [PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject) *\*name*, ..., NULL)**

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

Вызывает метод объекта *o*, где имя метода передаётся в виде строкового объекта Python в *name*. Вызывается с переменным числом аргументов [`PyObject*`](https://python-all.ru/3.0/c-api/structures.html#PyObject). Аргументы передаются как переменное число параметров, за которыми следует *NULL*. Возвращает результат вызова в случае успеха или *NULL* при ошибке.

**\[PyObject\_Hash\]long `PyObject_Hash`([PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject) *\*o*)**

Вычисляет и возвращает хеш-значение объекта *o*. В случае ошибки возвращает `-1`. Это эквивалент выражения Python `hash(o)`.

**\[PyObject\_HashNotImplemented\]long `PyObject_HashNotImplemented`([PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject) *\*o*)**

Устанавливает

[`TypeError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.TypeError)

, сообщающий, что

`type(o)`

не хешируется, и возвращает

`-1`

. Эта функция получает особую обработку, если помещена в слот

`tp_hash`

, позволяя типу явно указать интерпретатору, что он не хешируется.

**\[PyObject\_IsTrue\]int `PyObject_IsTrue`([PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject) *\*o*)**

Возвращает

`1`

, если объект

*o*

считается истинным, и

`0`

в противном случае. Это эквивалент выражения Python

`not not o`

. В случае ошибки возвращает

`-1`

.

**\[PyObject\_Not\]int `PyObject_Not`([PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject) *\*o*)**

Возвращает

`0`

, если объект

*o*

считается истинным, и

`1`

в противном случае. Это эквивалент выражения Python

`not o`

. В случае ошибки возвращает

`-1`

.

**\[PyObject\_Type\][PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject)\* `PyObject_Type`([PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject) *\*o*)**

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

Если *o* не равно *NULL*, возвращает объект типа, соответствующий типу объекта *o*. В случае ошибки возбуждает [`SystemError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.SystemError) и возвращает *NULL*. Это эквивалент выражения Python `type(o)`. Эта функция увеличивает счётчик ссылок возвращаемого значения. Нет особой причины использовать эту функцию вместо обычного выражения `o->ob_type`, которое возвращает указатель типа [`PyTypeObject*`](https://python-all.ru/3.0/c-api/type.html#PyTypeObject), за исключением случаев, когда требуется увеличенный счётчик ссылок.

**\[PyObject\_TypeCheck\]int `PyObject_TypeCheck`([PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject) *\*o*, [PyTypeObject](https://python-all.ru/3.0/c-api/type.html#PyTypeObject) *\*type*)**

Возвращает истину, если объект

*o*

имеет тип

*type*

или является подтипом

*type*

. Оба параметра не должны быть

*NULL*

.

**\[PyObject\_Length\]Py\_ssize\_t `PyObject_Length`([PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject) *\*o*)**

**Py\_ssize\_t `PyObject_Size`([PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject) *\*o*)**

Возвращает длину объекта *o*. Если объект *o* предоставляет протоколы последовательности и отображения, возвращается длина последовательности. При ошибке возвращается `-1`. Это эквивалент выражения Python `len(o)`.

**\[PyObject\_GetItem\][PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject)\* `PyObject_GetItem`([PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject) *\*o*, [PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject) *\*key*)**

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

Возвращает элемент *o*, соответствующий объекту *key*, или *NULL* при ошибке. Это эквивалентно выражению Python `o[key]`.

**\[PyObject\_SetItem\]int `PyObject_SetItem`([PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject) *\*o*, [PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject) *\*key*, [PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject) *\*v*)**

Сопоставляет объект

*key*

со значением

*v*

. При ошибке возвращает

`-1`

. Это эквивалент инструкции Python

`o[key] = v`

.

**\[PyObject\_DelItem\]int `PyObject_DelItem`([PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject) *\*o*, [PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject) *\*key*)**

Удаляет отображение для

*key*

из

*o*

. При ошибке возвращает

`-1`

. Это эквивалент инструкции Python

`del o[key]`

.

**\[PyObject\_Dir\][PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject)\* `PyObject_Dir`([PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject) *\*o*)**

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

Это эквивалентно выражению Python `dir(o)`: возвращает (возможно, пустой) список строк, подходящих для переданного объекта, или *NULL* в случае ошибки. Если аргумент равен *NULL*, это аналогично Python `dir()`, возвращающему имена текущих локальных переменных; в этом случае, если нет активного фрейма выполнения, возвращается *NULL*, но [`PyErr_Occurred`](https://python-all.ru/3.0/c-api/exceptions.html#PyErr_Occurred) вернёт false.

**\[PyObject\_GetIter\][PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject)\* `PyObject_GetIter`([PyObject](https://python-all.ru/3.0/c-api/structures.html#PyObject) *\*o*)**

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

Это эквивалент выражения Python `iter(o)`. Возвращает новый итератор для аргумента-объекта или сам объект, если он уже является итератором. Возбуждает [`TypeError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.TypeError) и возвращает *NULL*, если объект не может быть итерирован.
