对象协议 — Python 文档

来自菜鸟教程
Python/docs/2.7/c-api/object
跳转至:导航、​搜索

对象协议

int PyObject_Print(PyObject *o, FILE *fp, int flags)
在文件 fp 上打印对象 o。 出错时返回 -1。 flags 参数用于启用某些打印选项。 目前唯一支持的选项是Py_PRINT_RAW; 如果给定,则写入对象的 str() 而不是 repr()
int PyObject_HasAttr(PyObject *o, PyObject *attr_name)
如果 o 具有属性 attr_name,则返回 1,否则返回 0。 这相当于 Python 表达式 hasattr(o, attr_name)。 此功能总是成功。
int PyObject_HasAttrString(PyObject *o, const char *attr_name)
如果 o 具有属性 attr_name,则返回 1,否则返回 0。 这相当于 Python 表达式 hasattr(o, attr_name)。 此功能总是成功。
PyObject *PyObject_GetAttr(PyObject *o, PyObject *attr_name)
从对象 o 中检索名为 attr_name 的属性。 成功时返回属性值,失败时返回 NULL。 这相当于 Python 表达式 o.attr_name
PyObject *PyObject_GetAttrString(PyObject *o, const char *attr_name)
从对象 o 中检索名为 attr_name 的属性。 成功时返回属性值,失败时返回 NULL。 这相当于 Python 表达式 o.attr_name
PyObject *PyObject_GenericGetAttr(PyObject *o, PyObject *name)
旨在放入类型对象的 tp_getattro 插槽的通用属性 getter 函数。 它在对象的 MRO 中的类字典中查找描述符以及对象的 __dict__(如果存在)中的属性。 如 实现描述符 中所述,数据描述符优先于实例属性,而非数据描述符则不然。 否则,会引发 AttributeError
int PyObject_SetAttr(PyObject *o, PyObject *attr_name, PyObject *v)

将对象 o 的名为 attr_name 的属性的值设置为值 v。 引发异常并在失败时返回 -1; 成功返回 0。 这相当于 Python 语句 o.attr_name = v

如果 vNULL,则删除该属性,但不推荐使用此功能,以支持使用 PyObject_DelAttr()

int PyObject_SetAttrString(PyObject *o, const char *attr_name, PyObject *v)

将对象 o 的名为 attr_name 的属性的值设置为值 v。 引发异常并在失败时返回 -1; 成功返回 0。 这相当于 Python 语句 o.attr_name = v

如果 vNULL,则删除该属性,但不推荐使用此功能,而赞成使用 PyObject_DelAttrString()

int PyObject_GenericSetAttr(PyObject *o, PyObject *name, PyObject *value)
通用属性设置器和删除器函数,旨在放入类型对象的 tp_setattro 槽。 它在对象的 MRO 中的类字典中查找数据描述符,如果找到,它优先于设置或删除实例字典中的属性。 否则,在对象的 __dict__(如果存在)中设置或删除该属性。 成功时,返回 0,否则会引发 AttributeError 并返回 -1
int PyObject_DelAttr(PyObject *o, PyObject *attr_name)
删除名为 attr_name 的属性,用于对象 o。 失败时返回 -1。 这相当于 Python 语句 del o.attr_name
int PyObject_DelAttrString(PyObject *o, const char *attr_name)
删除名为 attr_name 的属性,用于对象 o。 失败时返回 -1。 这相当于 Python 语句 del o.attr_name
PyObject *PyObject_RichCompare(PyObject *o1, PyObject *o2, int opid)
使用 opid 指定的操作比较 o1o2 的值,该操作必须是 Py_LTPy_LE 之一, Py_EQ, Py_NE, Py_GT, or Py_GE,对应<,[X222X],[X] X234X]、!=>>=。 这相当于 Python 表达式 o1 op o2,其中 op 是对应于 opid 的运算符。 成功时返回比较值,失败时返回 NULL
int PyObject_RichCompareBool(PyObject *o1, PyObject *o2, int opid)
使用 opid 指定的操作比较 o1o2 的值,该操作必须是 Py_LTPy_LE 之一, Py_EQ, Py_NE, Py_GT, or Py_GE,对应<,[X222X],[X] X234X]、!=>>=。 出错时返回 -1,如果结果为假则返回 0,否则返回 1。 这相当于 Python 表达式 o1 op o2,其中 op 是对应于 opid 的运算符。

笔记

如果 o1o2 是同一个对象,则 PyObject_RichCompareBool() 将始终为 Py_EQ0 代表 Py_NE


int PyObject_Cmp(PyObject *o1, PyObject *o2, int *result)
使用 o1 提供的程序比较 o1o2 的值,如果存在,则使用 o2 提供的程序。 比较结果在result中返回。 失败时返回 -1。 这相当于 Python 语句 result = cmp(o1, o2)
int PyObject_Compare(PyObject *o1, PyObject *o2)
使用 o1 提供的程序比较 o1o2 的值,如果存在,则使用 o2 提供的程序。 返回比较成功的结果。 出错时,返回值未定义; 使用 PyErr_Occurred() 检测错误。 这相当于 Python 表达式 cmp(o1, o2)
PyObject *PyObject_Repr(PyObject *o)
计算对象 o 的字符串表示。 成功时返回字符串表示,失败时返回 NULL。 这相当于 Python 表达式 repr(o)。 由 repr() 内置函数和反引号调用。
PyObject *PyObject_Str(PyObject *o)
计算对象 o 的字符串表示。 成功时返回字符串表示,失败时返回 NULL。 这相当于 Python 表达式 str(o)。 由 str() 内置函数和 print 语句调用。
PyObject *PyObject_Bytes(PyObject *o)
计算对象 o 的字节表示。 在 2.x 中,这只是 PyObject_Str() 的别名。
PyObject *PyObject_Unicode(PyObject *o)
计算对象 o 的 Unicode 字符串表示。 成功时返回 Unicode 字符串表示,失败时返回 NULL。 这相当于 Python 表达式 unicode(o)。 由 unicode() 内置函数调用。
int PyObject_IsInstance(PyObject *inst, PyObject *cls)

如果 inst 是类 cls 的实例或 cls 的子类,则返回 1,否则返回 0。 出错时,返回 -1 并设置异常。 如果 cls 是类型对象而不是类对象,则 PyObject_IsInstance() 返回 1 如果 inst 是 cls[ X146X]。 如果 cls 是一个元组,将对 cls 中的每个条目进行检查。 当至少一项检查返回 1 时,结果将为 1,否则为 0。 如果 inst 不是类实例并且 cls 既不是类型对象,也不是类对象,也不是元组,则 inst 必须有一个 __class__ 属性 — 该属性的值与 cls 的类关系将用于确定此函数的结果。

2.1 版中的新功能。

在 2.2 版更改: 支持元组作为添加的第二个参数。

子类确定以一种相当直接的方式完成,但包括类系统扩展的实现者可能想要注意的一个问题。 如果 AB 是类对象,则 BA 的子类,如果它直接或间接继承自 A。 如果其中一个不是类对象,则使用更通用的机制来确定两个对象的类关系。 当测试 B 是否是 A 的子类时,如果 AB,则 PyObject_IsSubclass() 返回 true . 如果 AB 是不同的对象,则 B__bases__ 属性以深度优先的方式搜索 A__bases__ 属性的存在被认为足以进行此确定。

int PyObject_IsSubclass(PyObject *derived, PyObject *cls)

如果类 派生 与类 cls 相同或派生自类,则返回 1,否则返回 0。 如果出现错误,则返回 -1。 如果 cls 是一个元组,将对 cls 中的每个条目进行检查。 当至少一项检查返回 1 时,结果将为 1,否则为 0。 如果 derivedcls 不是实际的类对象(或元组),则此函数使用上述通用算法。

2.1 版中的新功能。

2.3 版更改: 旧版本的 Python 不支持元组作为第二个参数。

int PyCallable_Check(PyObject *o)
确定对象 o 是否可调用。 如果对象可调用,则返回 1,否则返回 0。 此功能总是成功。
PyObject *PyObject_Call(PyObject *callable_object, PyObject *args, PyObject *kw)

调用可调用的 Python 对象 callable_object,参数由元组 args 给出,命名参数由字典 kw 给出。 如果不需要命名参数,kw 可能是 NULLargs 不能是 NULL,如果不需要参数,请使用空元组。 成功返回调用结果,失败返回 NULL。 这相当于 Python 表达式 apply(callable_object, args, kw)callable_object(*args, **kw)

2.2 版中的新功能。

PyObject *PyObject_CallObject(PyObject *callable_object, PyObject *args)
调用可调用的 Python 对象 callable_object,参数由元组 args 给出。 如果不需要参数,则 args 可能是 NULL。 成功返回调用结果,失败返回 NULL。 这相当于 Python 表达式 apply(callable_object, args)callable_object(*args)
PyObject *PyObject_CallFunction(PyObject *callable, char *format, ...)
使用可变数量的 C 参数调用可调用 Python 对象 callable。 C 参数使用 Py_BuildValue() 样式格式字符串进行描述。 格式可能是NULL,表示没有提供参数。 成功返回调用结果,失败返回 NULL。 这相当于 Python 表达式 apply(callable, args)callable(*args)。 请注意,如果您只传递 PyObject * 参数,则 PyObject_CallFunctionObjArgs() 是一个更快的选择。
PyObject *PyObject_CallMethod(PyObject *o, char *method, char *format, ...)
使用可变数量的 C 参数调用对象 o 的名为 method 的方法。 C 参数由应生成元组的 Py_BuildValue() 格式字符串描述。 格式可能是NULL,表示没有提供参数。 成功返回调用结果,失败返回 NULL。 这相当于 Python 表达式 o.method(args)。 请注意,如果您只传递 PyObject * 参数,则 PyObject_CallMethodObjArgs() 是一个更快的选择。
PyObject* PyObject_CallFunctionObjArgs(PyObject *callable, ..., NULL)

使用可变数量的 PyObject* 参数调用可调用 Python 对象 callable。 参数以可变数量的参数形式提供,后跟 NULL。 成功返回调用结果,失败返回 NULL

2.2 版中的新功能。

PyObject* PyObject_CallMethodObjArgs(PyObject *o, PyObject *name, ..., NULL)

调用对象 o 的方法,其中方法的名称在 name 中作为 Python 字符串对象给出。 它使用可变数量的 PyObject* 参数调用。 参数以可变数量的参数形式提供,后跟 NULL。 成功返回调用结果,失败返回 NULL

2.2 版中的新功能。

long PyObject_Hash(PyObject *o)
计算并返回对象 o 的哈希值。 失败时,返回 -1。 这相当于 Python 表达式 hash(o)
long PyObject_HashNotImplemented(PyObject *o)

设置 TypeError 表示 type(o) 不可哈希并返回 -1。 此函数在存储在 tp_hash 插槽中时会受到特殊处理,允许类型明确地向解释器指示它不可散列。

2.6 版中的新功能。

int PyObject_IsTrue(PyObject *o)
如果对象 o 被认为是真,则返回 1,否则返回 0。 这相当于 Python 表达式 not not o。 失败时,返回 -1
int PyObject_Not(PyObject *o)
如果对象 o 被认为是真,则返回 0,否则返回 1。 这相当于 Python 表达式 not o。 失败时,返回 -1
PyObject *PyObject_Type(PyObject *o)
o为非NULL时,返回与对象o的对象类型对应的类型对象。 失败时,引发 SystemError 并返回 NULL。 这相当于 Python 表达式 type(o)。 此函数增加返回值的引用计数。 真的没有理由使用这个函数代替通用表达式 o->ob_type,它返回一个类型为 PyTypeObject* 的指针,除非需要增加引用计数。
int PyObject_TypeCheck(PyObject *o, PyTypeObject *type)

如果对象 o 的类型为 typetype 的子类型,则返回 true。 两个参数都必须是非 NULL

2.2 版中的新功能。

Py_ssize_t PyObject_Length(PyObject *o)

Py_ssize_t PyObject_Size(PyObject *o)

返回对象 o 的长度。 如果对象 o 提供序列和映射协议,则返回序列长度。 出错时,返回 -1。 这相当于 Python 表达式 len(o)

2.5 版更改: 这些函数返回 int 类型。 这可能需要更改您的代码才能正确支持 64 位系统。

PyObject *PyObject_GetItem(PyObject *o, PyObject *key)
失败时返回与对象 keyNULL 对应的 o 的元素。 这相当于 Python 表达式 o[key]
int PyObject_SetItem(PyObject *o, PyObject *key, PyObject *v)
将对象 key 映射到值 v。 引发异常并在失败时返回 -1; 成功返回 0。 这相当于 Python 语句 o[key] = v
int PyObject_DelItem(PyObject *o, PyObject *key)
o 中删除 key 的映射。 失败时返回 -1。 这相当于 Python 语句 del o[key]
int PyObject_AsFileDescriptor(PyObject *o)
从 Python 对象派生文件描述符。 如果对象是整数或长整数,则返回其值。 如果不存在,则对象的fileno()方法存在则调用; 该方法必须返回一个整数或长整数,作为文件描述符值返回。 失败时返回 -1
PyObject *PyObject_Dir(PyObject *o)
这等效于 Python 表达式 dir(o),返回一个(可能为空)适合对象参数的字符串列表,如果出现错误,则返回 NULL。 如果参数是NULL,这就像Python的dir(),返回当前本地人的名字; 在这种情况下,如果没有执行帧处于活动状态,则返回 NULLPyErr_Occurred() 将返回 false。
PyObject *PyObject_GetIter(PyObject *o)
这相当于 Python 表达式 iter(o)。 它为对象参数返回一个新的迭代器,如果对象已经是迭代器,则返回对象本身。 如果对象无法迭代,则引发 TypeError 并返回 NULL