对象协议 — Python 文档
对象协议
- int PyObject_Print(PyObject *o, FILE *fp, int flags)
- 如果 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)
。 此功能总是成功。
- 从对象 o 中检索名为 attr_name 的属性。 成功时返回属性值,失败时返回 NULL。 这相当于 Python 表达式
o.attr_name
。
- 从对象 o 中检索名为 attr_name 的属性。 成功时返回属性值,失败时返回 NULL。 这相当于 Python 表达式
o.attr_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
。如果 v 是 NULL,则删除该属性,但不推荐使用此功能,以支持使用 PyObject_DelAttr()。
- int PyObject_SetAttrString(PyObject *o, const char *attr_name, PyObject *v)
将对象 o 的名为 attr_name 的属性的值设置为值 v。 引发异常并在失败时返回
-1
; 成功返回0
。 这相当于 Python 语句o.attr_name = v
。如果 v 是 NULL,则删除该属性,但不推荐使用此功能,而赞成使用 PyObject_DelAttrString()。
- 通用属性设置器和删除器函数,旨在放入类型对象的 tp_setattro 槽。 它在对象的 MRO 中的类字典中查找数据描述符,如果找到,它优先于设置或删除实例字典中的属性。 否则,在对象的 __dict__(如果存在)中设置或删除该属性。 成功时,返回
0
,否则会引发AttributeError
并返回-1
。
- 删除名为 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
。
- 使用 opid 指定的操作比较 o1 和 o2 的值,该操作必须是
Py_LT
、Py_LE
之一,Py_EQ
,Py_NE
,Py_GT
, orPy_GE
,对应<
,[X222X],[X] X234X]、!=
、>
或>=
。 这相当于 Python 表达式o1 op o2
,其中op
是对应于 opid 的运算符。 成功时返回比较值,失败时返回 NULL。
- 使用 opid 指定的操作比较 o1 和 o2 的值,该操作必须是
Py_LT
、Py_LE
之一,Py_EQ
,Py_NE
,Py_GT
, orPy_GE
,对应<
,[X222X],[X] X234X]、!=
、>
或>=
。 出错时返回-1
,如果结果为假则返回0
,否则返回1
。 这相当于 Python 表达式o1 op o2
,其中op
是对应于 opid 的运算符。
- 使用 o1 提供的程序比较 o1 和 o2 的值,如果存在,则使用 o2 提供的程序。 比较结果在result中返回。 失败时返回
-1
。 这相当于 Python 语句result = cmp(o1, o2)
。
- 使用 o1 提供的程序比较 o1 和 o2 的值,如果存在,则使用 o2 提供的程序。 返回比较成功的结果。 出错时,返回值未定义; 使用 PyErr_Occurred() 检测错误。 这相当于 Python 表达式
cmp(o1, o2)
。
- 计算对象 o 的字符串表示。 成功时返回字符串表示,失败时返回 NULL。 这相当于 Python 表达式
repr(o)
。 由 repr() 内置函数和反引号调用。
- 计算对象 o 的字节表示。 在 2.x 中,这只是 PyObject_Str() 的别名。
- 计算对象 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 版更改: 支持元组作为添加的第二个参数。
子类确定以一种相当直接的方式完成,但包括类系统扩展的实现者可能想要注意的一个问题。 如果 A
和 B
是类对象,则 B
是 A
的子类,如果它直接或间接继承自 A
。 如果其中一个不是类对象,则使用更通用的机制来确定两个对象的类关系。 当测试 B 是否是 A 的子类时,如果 A 是 B,则 PyObject_IsSubclass() 返回 true . 如果 A 和 B 是不同的对象,则 B 的 __bases__ 属性以深度优先的方式搜索 A — __bases__ 属性的存在被认为足以进行此确定。
- int PyObject_IsSubclass(PyObject *derived, PyObject *cls)
如果类 派生 与类 cls 相同或派生自类,则返回
1
,否则返回0
。 如果出现错误,则返回-1
。 如果 cls 是一个元组,将对 cls 中的每个条目进行检查。 当至少一项检查返回1
时,结果将为1
,否则为0
。 如果 derived 或 cls 不是实际的类对象(或元组),则此函数使用上述通用算法。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 可能是 NULL。 args 不能是 NULL,如果不需要参数,请使用空元组。 成功返回调用结果,失败返回 NULL。 这相当于 Python 表达式
apply(callable_object, args, kw)
或callable_object(*args, **kw)
。2.2 版中的新功能。
- 调用可调用的 Python 对象 callable_object,参数由元组 args 给出。 如果不需要参数,则 args 可能是 NULL。 成功返回调用结果,失败返回 NULL。 这相当于 Python 表达式
apply(callable_object, args)
或callable_object(*args)
。
- 使用可变数量的 C 参数调用可调用 Python 对象 callable。 C 参数使用 Py_BuildValue() 样式格式字符串进行描述。 格式可能是NULL,表示没有提供参数。 成功返回调用结果,失败返回 NULL。 这相当于 Python 表达式
apply(callable, args)
或callable(*args)
。 请注意,如果您只传递PyObject *
参数,则PyObject_CallFunctionObjArgs()
是一个更快的选择。
- 使用可变数量的 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
。
- 当o为非NULL时,返回与对象o的对象类型对应的类型对象。 失败时,引发
SystemError
并返回 NULL。 这相当于 Python 表达式type(o)
。 此函数增加返回值的引用计数。 真的没有理由使用这个函数代替通用表达式o->ob_type
,它返回一个类型为PyTypeObject*
的指针,除非需要增加引用计数。
- int PyObject_TypeCheck(PyObject *o, PyTypeObject *type)
如果对象 o 的类型为 type 或 type 的子类型,则返回 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 位系统。
- 失败时返回与对象 key 或 NULL 对应的 o 的元素。 这相当于 Python 表达式
o[key]
。
- 将对象 key 映射到值 v。 引发异常并在失败时返回
-1
; 成功返回0
。 这相当于 Python 语句o[key] = v
。
- 从 o 中删除 key 的映射。 失败时返回
-1
。 这相当于 Python 语句del o[key]
。
- int PyObject_AsFileDescriptor(PyObject *o)
- 从 Python 对象派生文件描述符。 如果对象是整数或长整数,则返回其值。 如果不存在,则对象的
fileno()
方法存在则调用; 该方法必须返回一个整数或长整数,作为文件描述符值返回。 失败时返回-1
。
- 这等效于 Python 表达式
dir(o)
,返回一个(可能为空)适合对象参数的字符串列表,如果出现错误,则返回 NULL。 如果参数是NULL,这就像Python的dir()
,返回当前本地人的名字; 在这种情况下,如果没有执行帧处于活动状态,则返回 NULL 但 PyErr_Occurred() 将返回 false。
- 这相当于 Python 表达式
iter(o)
。 它为对象参数返回一个新的迭代器,如果对象已经是迭代器,则返回对象本身。 如果对象无法迭代,则引发TypeError
并返回 NULL。