object.md
1> **Источник:** https://python-all.ru/3.3/c-api/object.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# Протокол объектов89**[PyObject](https://python-all.ru/3.3/c-api/structures.html#PyObject)\* `Py_NotImplemented`**1011Синглтон `NotImplemented` используется для указания, что операция не реализована для данной комбинации типов.1213**`Py_RETURN_NOTIMPLEMENTED`**1415Корректно обрабатывает возврат [`Py_NotImplemented`](https://python-all.ru/3.3/c-api/object.html#Py_NotImplemented) из C-функции (то есть увеличивает счётчик ссылок NotImplemented и возвращает его).1617#### `int PyObject_Print(PyObject *o, FILE *fp, int flags)`1819Выводит объект *o* в файл *fp*. Возвращает `-1` в случае ошибки. Аргумент flags используется для включения определённых опций вывода. Единственная поддерживаемая в настоящее время опция – `Py_PRINT_RAW`; если она указана, выводится [`str()`](https://python-all.ru/3.3/library/stdtypes.html#str) объекта вместо [`repr()`](https://python-all.ru/3.3/library/functions.html#repr).2021#### `int PyObject_HasAttr(PyObject *o, PyObject *attr_name)`2223Возвращает `1`, если *o* имеет атрибут *attr\_name*, и `0` в противном случае. Это эквивалентно выражению Python `hasattr(o, attr_name)`. Эта функция всегда завершается успешно.2425#### `int PyObject_HasAttrString(PyObject *o, const char *attr_name)`2627Возвращает `1`, если *o* имеет атрибут *attr\_name*, и `0` в противном случае. Это эквивалентно выражению Python `hasattr(o, attr_name)`. Эта функция всегда завершается успешно.2829#### `PyObject* PyObject_GetAttr(PyObject *o, PyObject *attr_name)`3031*Возвращаемое значение: новая ссылка.*3233Извлекает атрибут с именем *attr\_name* из объекта *o*. Возвращает значение атрибута при успехе или *NULL* при неудаче. Это эквивалент выражения Python `o.attr_name`.3435#### `PyObject* PyObject_GetAttrString(PyObject *o, const char *attr_name)`3637*Возвращаемое значение: новая ссылка.*3839Извлекает атрибут с именем *attr\_name* из объекта *o*. Возвращает значение атрибута при успехе или *NULL* при неудаче. Это эквивалент выражения Python `o.attr_name`.4041#### `PyObject* PyObject_GenericGetAttr(PyObject *o, PyObject *name)`4243Обобщённая функция получения атрибута, предназначенная для размещения в слоте `tp_getattro` объекта типа. Она ищет дескриптор в словаре классов в MRO объекта, а также атрибут в [`__dict__`](https://python-all.ru/3.3/library/stdtypes.html#object.__dict__) объекта (если он присутствует). Как описано в [*Implementing Descriptors*](https://python-all.ru/3.3/reference/datamodel.html#descriptors), дескрипторы данных имеют приоритет над атрибутами экземпляра, а недескрипторы данных – нет. В противном случае возбуждается [`AttributeError`](https://python-all.ru/3.3/library/exceptions.html#AttributeError).4445#### `int PyObject_SetAttr(PyObject *o, PyObject *attr_name, PyObject *v)`4647Устанавливает значение атрибута с именем *attr\_name* для объекта *o* равным *v*. Возвращает `-1` при неудаче. Это эквивалент оператора Python `o.attr_name = v`.4849#### `int PyObject_SetAttrString(PyObject *o, const char *attr_name, PyObject *v)`5051Устанавливает значение атрибута с именем *attr\_name* для объекта *o* равным *v*. Возвращает `-1` при неудаче. Это эквивалент оператора Python `o.attr_name = v`.5253#### `int PyObject_GenericSetAttr(PyObject *o, PyObject *name, PyObject *value)`5455Обобщённая функция установки атрибута, предназначенная для размещения в слоте `tp_setattro` объекта типа. Она ищет дескриптор данных в словаре классов в MRO объекта, и если он найден, он имеет приоритет над установкой атрибута в словаре экземпляра. В противном случае атрибут устанавливается в [`__dict__`](https://python-all.ru/3.3/library/stdtypes.html#object.__dict__) объекта (если он присутствует). В противном случае возбуждается [`AttributeError`](https://python-all.ru/3.3/library/exceptions.html#AttributeError) и возвращается `-1`.5657#### `int PyObject_DelAttr(PyObject *o, PyObject *attr_name)`5859Удаляет атрибут с именем *attr\_name* для объекта *o*. Возвращает `-1` при неудаче. Это эквивалент оператора Python `del o.attr_name`.6061#### `int PyObject_DelAttrString(PyObject *o, const char *attr_name)`6263Удаляет атрибут с именем *attr\_name* для объекта *o*. Возвращает `-1` при неудаче. Это эквивалент оператора Python `del o.attr_name`.6465#### `PyObject* PyType_GenericGetDict(PyObject *o, void *context)`6667Обобщённая реализация геттера дескриптора `__dict__`. При необходимости создаёт словарь.6869Новое в версии 3.3.7071#### `int PyType_GenericSetDict(PyObject *o, void *context)`7273Обобщённая реализация сеттера дескриптора `__dict__`. Эта реализация не позволяет удалять словарь.7475Новое в версии 3.3.7677#### `PyObject* PyObject_RichCompare(PyObject *o1, PyObject *o2, int opid)`7879*Возвращаемое значение: новая ссылка.*8081Сравнивает значения *o1* и *o2* с помощью операции, заданной *opid*, которая должна быть одной из `Py_LT`, `Py_LE`, `Py_EQ`, `Py_NE`, `Py_GT` или `Py_GE`, что соответствует `<`, `<=`, `==`, `!=`, `>` или `>=` соответственно. Это эквивалент выражения Python `o1 op o2`, где `op` – оператор, соответствующий *opid*. Возвращает результат сравнения в случае успеха или *NULL* при ошибке.8283#### `int PyObject_RichCompareBool(PyObject *o1, PyObject *o2, int opid)`8485Сравнивает значения *o1* и *o2* с помощью операции, заданной *opid*, которая должна быть одной из `Py_LT`, `Py_LE`, `Py_EQ`, `Py_NE`, `Py_GT` или `Py_GE`, что соответствует `<`, `<=`, `==`, `!=`, `>` или `>=` соответственно. Возвращает `-1` при ошибке, `0` если результат ложный, `1` в противном случае. Это эквивалент выражения Python `o1 op o2`, где `op` – оператор, соответствующий *opid*.8687> **Примечание**88>89> Если *o1* и *o2* – один и тот же объект, [`PyObject_RichCompareBool()`](https://python-all.ru/3.3/c-api/object.html#PyObject_RichCompareBool) всегда вернёт `1` для `Py_EQ` и `0` для `Py_NE`.9091#### `PyObject* PyObject_Repr(PyObject *o)`9293*Возвращаемое значение: новая ссылка.*9495Вычисляет строковое представление объекта *o*. Возвращает строковое представление в случае успеха или *NULL* при ошибке. Это эквивалент выражения Python `repr(o)`. Вызывается встроенной функцией [`repr()`](https://python-all.ru/3.3/library/functions.html#repr).9697#### `PyObject* PyObject_ASCII(PyObject *o)`9899Как и [`PyObject_Repr()`](https://python-all.ru/3.3/c-api/object.html#PyObject_Repr), вычисляет строковое представление объекта *o*, но экранирует не-ASCII символы в строке, возвращаемой [`PyObject_Repr()`](https://python-all.ru/3.3/c-api/object.html#PyObject_Repr), используя управляющие последовательности `\x`, `\u` или `\U`. Создаёт строку, похожую на ту, что возвращала [`PyObject_Repr()`](https://python-all.ru/3.3/c-api/object.html#PyObject_Repr) в Python 2. Вызывается встроенной функцией [`ascii()`](https://python-all.ru/3.3/library/functions.html#ascii).100101#### `PyObject* PyObject_Str(PyObject *o)`102103*Возвращаемое значение: новая ссылка.*104105Вычисляет строковое представление объекта *o*. Возвращает строковое представление в случае успеха или *NULL* при ошибке. Это эквивалент выражения Python `str(o)`. Вызывается встроенной функцией [`str()`](https://python-all.ru/3.3/library/stdtypes.html#str) и, следовательно, функцией [`print()`](https://python-all.ru/3.3/library/functions.html#print).106107#### `PyObject* PyObject_Bytes(PyObject *o)`108109Вычисляет байтовое представление объекта *o*. *NULL* возвращается при ошибке, а в случае успеха – объект bytes. Это эквивалент выражения Python `bytes(o)`, когда *o* не является целым числом. В отличие от `bytes(o)`, при передаче целого числа *o* возбуждается TypeError, а не возвращается байтовый объект, заполненный нулями.110111#### `int PyObject_IsInstance(PyObject *inst, PyObject *cls)`112113Возвращает `1`, если *inst* является экземпляром класса *cls* или подкласса *cls*, и `0` в противном случае. В случае ошибки возвращает `-1` и устанавливает исключение. Если *cls* является объектом типа, а не объектом класса, [`PyObject_IsInstance()`](https://python-all.ru/3.3/c-api/object.html#PyObject_IsInstance) возвращает `1`, если *inst* имеет тип *cls*. Если *cls* является кортежем, проверка будет выполнена для каждого элемента *cls*. Результат будет `1`, когда хотя бы одна из проверок возвращает `1`, иначе `0`. Если *inst* не является экземпляром класса, а *cls* не является ни объектом типа, ни объектом класса, ни кортежем, то *inst* должен иметь атрибут [`__class__`](https://python-all.ru/3.3/library/stdtypes.html#instance.__class__) – связь класса значения этого атрибута с *cls* будет использована для определения результата этой функции.114115Определение подкласса выполняется довольно прямолинейно, но содержит один нюанс, о котором разработчикам расширений классовой системы стоит знать. Если `A` и `B` являются объектами классов, то `B` является подклассом `A`, если он наследуется от `A` прямо или косвенно. Если какой-либо из них не является объектом класса, используется более общий механизм для определения связи между двумя объектами. При проверке, является ли *B* подклассом *A*, если *A* равно *B*, то [`PyObject_IsSubclass()`](https://python-all.ru/3.3/c-api/object.html#PyObject_IsSubclass) возвращает истину. Если *A* и *B* – разные объекты, атрибут [`__bases__`](https://python-all.ru/3.3/library/stdtypes.html#class.__bases__) объекта *B* ищется в глубину для *A* – наличие атрибута [`__bases__`](https://python-all.ru/3.3/library/stdtypes.html#class.__bases__) считается достаточным для этого определения.116117#### `int PyObject_IsSubclass(PyObject *derived, PyObject *cls)`118119Возвращает `1`, если класс *derived* идентичен классу *cls* или наследуется от него, иначе возвращает `0`. В случае ошибки возвращает `-1`. Если *cls* является кортежем, проверка будет выполнена для каждого элемента *cls*. Результат будет `1`, когда хотя бы одна из проверок возвращает `1`, иначе `0`. Если *derived* или *cls* не являются реальными объектами классов (или кортежем), эта функция использует описанный выше общий алгоритм.120121#### `int PyCallable_Check(PyObject *o)`122123Определяет, является ли объект *o* вызываемым. Возвращает `1`, если объект вызываем, и `0` в противном случае. Эта функция всегда завершается успешно.124125#### `PyObject* PyObject_Call(PyObject *callable_object, PyObject *args, PyObject *kw)`126127*Возвращаемое значение: новая ссылка.*128129Вызывает вызываемый объект Python *callable\_object* с аргументами, заданными кортежем *args*, и именованными аргументами, заданными словарём *kw*. Если именованные аргументы не нужны, *kw* может быть *NULL*. *args* не должен быть *NULL*; если аргументы не нужны, используйте пустой кортеж. Возвращает результат вызова в случае успеха или *NULL* при ошибке. Это эквивалент выражения Python `callable_object(*args, **kw)`.130131#### `PyObject* PyObject_CallObject(PyObject *callable_object, PyObject *args)`132133*Возвращаемое значение: новая ссылка.*134135Вызывает вызываемый объект Python *callable\_object* с аргументами, заданными кортежем *args*. Если аргументы не нужны, то *args* может быть *NULL*. Возвращает результат вызова в случае успеха или *NULL* при ошибке. Это эквивалент выражения Python `callable_object(*args)`.136137#### `PyObject* PyObject_CallFunction(PyObject *callable, char *format, ...)`138139*Возвращаемое значение: новая ссылка.*140141Вызывает вызываемый объект Python *callable* с переменным числом аргументов C. Аргументы C описываются строкой форматирования в стиле [`Py_BuildValue()`](https://python-all.ru/3.3/c-api/arg.html#Py_BuildValue). Формат может быть *NULL*, что означает отсутствие аргументов. Возвращает результат вызова в случае успеха или *NULL* при ошибке. Это эквивалент выражения Python `callable(*args)`. Обратите внимание: если передаются только аргументы типа [`PyObject *`](https://python-all.ru/3.3/c-api/structures.html#PyObject), то более быстрой альтернативой будет [`PyObject_CallFunctionObjArgs()`](https://python-all.ru/3.3/c-api/object.html#PyObject_CallFunctionObjArgs).142143#### `PyObject* PyObject_CallMethod(PyObject *o, char *method, char *format, ...)`144145*Возвращаемое значение: новая ссылка.*146147Вызывает метод с именем *method* объекта *o* с переменным числом аргументов C. Аргументы C описываются строкой форматирования в стиле [`Py_BuildValue()`](https://python-all.ru/3.3/c-api/arg.html#Py_BuildValue), которая должна создавать кортеж. Формат может быть *NULL*, что означает отсутствие аргументов. Возвращает результат вызова в случае успеха или *NULL* при ошибке. Это эквивалент выражения Python `o.method(args)`. Обратите внимание: если передаются только аргументы типа [`PyObject *`](https://python-all.ru/3.3/c-api/structures.html#PyObject), то более быстрой альтернативой будет [`PyObject_CallMethodObjArgs()`](https://python-all.ru/3.3/c-api/object.html#PyObject_CallMethodObjArgs).148149#### `PyObject* PyObject_CallFunctionObjArgs(PyObject *callable, ..., NULL)`150151*Возвращаемое значение: новая ссылка.*152153Вызывает вызываемый объект Python *callable* с переменным числом аргументов типа [`PyObject*`](https://python-all.ru/3.3/c-api/structures.html#PyObject). Аргументы передаются как переменное число параметров, за которыми следует *NULL*. Возвращает результат вызова в случае успеха или *NULL* при ошибке.154155#### `PyObject* PyObject_CallMethodObjArgs(PyObject *o, PyObject *name, ..., NULL)`156157*Возвращаемое значение: новая ссылка.*158159Вызывает метод объекта *o*, где имя метода передаётся в виде строкового объекта Python в *name*. Вызывается с переменным числом аргументов [`PyObject*`](https://python-all.ru/3.3/c-api/structures.html#PyObject). Аргументы передаются как переменное число параметров, за которыми следует *NULL*. Возвращает результат вызова в случае успеха или *NULL* при ошибке.160161#### `Py_hash_t PyObject_Hash(PyObject *o)`162163Вычисляет и возвращает хеш-значение объекта *o*. В случае ошибки возвращает `-1`. Это эквивалент выражения Python `hash(o)`.164165Изменено в версии 3.2: Тип возвращаемого значения теперь Py\_hash\_t. Это знаковое целое того же размера, что и Py\_ssize\_t.166167#### `Py_hash_t PyObject_HashNotImplemented(PyObject *o)`168169Устанавливает [`TypeError`](https://python-all.ru/3.3/library/exceptions.html#TypeError), сообщающий, что `type(o)` не хешируется, и возвращает `-1`. Эта функция получает особую обработку, если помещена в слот `tp_hash`, позволяя типу явно указать интерпретатору, что он не хешируется.170171#### `int PyObject_IsTrue(PyObject *o)`172173Возвращает `1`, если объект *o* считается истинным, и `0` в противном случае. Это эквивалент выражения Python `not not o`. В случае ошибки возвращает `-1`.174175#### `int PyObject_Not(PyObject *o)`176177Возвращает `0`, если объект *o* считается истинным, и `1` в противном случае. Это эквивалент выражения Python `not o`. В случае ошибки возвращает `-1`.178179#### `PyObject* PyObject_Type(PyObject *o)`180181*Возвращаемое значение: новая ссылка.*182183Если *o* не равно *NULL*, возвращает объект типа, соответствующий типу объекта *o*. В случае ошибки возбуждает [`SystemError`](https://python-all.ru/3.3/library/exceptions.html#SystemError) и возвращает *NULL*. Это эквивалент выражения Python `type(o)`. Эта функция увеличивает счётчик ссылок возвращаемого значения. Нет особой причины использовать эту функцию вместо обычного выражения `o->ob_type`, которое возвращает указатель типа [`PyTypeObject*`](https://python-all.ru/3.3/c-api/type.html#PyTypeObject), за исключением случаев, когда требуется увеличенный счётчик ссылок.184185#### `int PyObject_TypeCheck(PyObject *o, PyTypeObject *type)`186187Возвращает истину, если объект *o* имеет тип *type* или является подтипом *type*. Оба параметра не должны быть *NULL*.188189#### `Py_ssize_t PyObject_Length(PyObject *o)`190191#### `Py_ssize_t PyObject_Size(PyObject *o)`192193Возвращает длину объекта *o*. Если объект *o* предоставляет протоколы последовательности и отображения, возвращается длина последовательности. При ошибке возвращается `-1`. Это эквивалент выражения Python `len(o)`.194195#### `PyObject* PyObject_GetItem(PyObject *o, PyObject *key)`196197*Возвращаемое значение: новая ссылка.*198199Возвращает элемент *o*, соответствующий объекту *key*, или *NULL* при ошибке. Это эквивалентно выражению Python `o[key]`.200201#### `int PyObject_SetItem(PyObject *o, PyObject *key, PyObject *v)`202203Сопоставляет объект *key* со значением *v*. При ошибке возвращает `-1`. Это эквивалент инструкции Python `o[key] = v`.204205#### `int PyObject_DelItem(PyObject *o, PyObject *key)`206207Удаляет отображение для *key* из *o*. При ошибке возвращает `-1`. Это эквивалент инструкции Python `del o[key]`.208209#### `PyObject* PyObject_Dir(PyObject *o)`210211*Возвращаемое значение: новая ссылка.*212213Это эквивалент выражения Python `dir(o)`, возвращает (возможно, пустой) список строк, соответствующий аргументу-объекту, или *NULL* в случае ошибки. Если аргумент равен *NULL*, это аналогично Python `dir()`, возвращающему имена текущих локальных переменных; в этом случае, если активного кадра выполнения нет, возвращается *NULL*, но [`PyErr_Occurred()`](https://python-all.ru/3.3/c-api/exceptions.html#PyErr_Occurred) вернёт ложь.214215#### `PyObject* PyObject_GetIter(PyObject *o)`216217*Возвращаемое значение: новая ссылка.*218219Это эквивалент выражения Python `iter(o)`. Возвращает новый итератор для аргумента-объекта или сам объект, если он уже является итератором. Возбуждает [`TypeError`](https://python-all.ru/3.3/library/exceptions.html#TypeError) и возвращает *NULL*, если объект не может быть итерирован.220