Object Protocol
-
int
PyObject_Print
(PyObject *o ,FILE fp *,int * flags *) -
int
PyObject_HasAttr
(PyObject *o ,PyObject attr_name *)- 如果* o 具有属性 attr_name *,则返回
1
,否则返回0
。这等效于 Python 表达式hasattr(o, attr_name)
。此Function始终成功。
- 如果* o 具有属性 attr_name *,则返回
-
int
PyObject_HasAttrString
(PyObject *o ,const char attr_name *)- 如果* o 具有属性 attr_name *,则返回
1
,否则返回0
。这等效于 Python 表达式hasattr(o, attr_name)
。此Function始终成功。
- 如果* o 具有属性 attr_name *,则返回
-
PyObject *
PyObject_GetAttr
(PyObject *o ,PyObject attr_name *)- 返回值:新参考.
从对象* o 检索名为 attr_name 的属性。成功返回属性值,失败则返回 NULL *。这等效于 Python 表达式o.attr_name
。
从对象* o 检索名为 attr_name 的属性。成功返回属性值,失败则返回 NULL *。这等效于 Python 表达式o.attr_name
。
-
PyObject *
PyObject_GenericGetAttr
(PyObject *o ,PyObject name *)- 通用属性获取器函数,应将其放入类型对象的
tp_getattro
插槽中。它在对象的 MRO 中的类字典中查找 Descriptors,并在对象的dict(如果存在)中查找属性。如Implementing Descriptors所述,数据 Descriptors 优先于实例属性,而非数据 Descriptors 则不然。否则,将引发AttributeError。
- 通用属性获取器函数,应将其放入类型对象的
-
int
PyObject_SetAttr
(PyObject *o ,PyObject attr_name *,PyObject ** v *)- 将对象* o 的名为 attr_name 的属性的值设置为 v *的值。引发异常并在失败时返回
-1
;成功返回0
。这等效于 Python 语句o.attr_name = v
。
- 将对象* o 的名为 attr_name 的属性的值设置为 v *的值。引发异常并在失败时返回
如果* v 为 NULL *,则会删除该属性,但是不建议使用此Function,而推荐使用PyObject_DelAttr()。
- int
PyObject_SetAttrString
(PyObject *o ,const char attr_name *,PyObject ** v *)- 将对象* o 的名为 attr_name 的属性的值设置为 v *的值。引发异常并在失败时返回
-1
;成功返回0
。这等效于 Python 语句o.attr_name = v
。
- 将对象* o 的名为 attr_name 的属性的值设置为 v *的值。引发异常并在失败时返回
如果* v 为 NULL *,则会删除该属性,但是不建议使用此Function,而推荐使用PyObject_DelAttrString()。
-
int
PyObject_GenericSetAttr
(PyObject *o ,PyObject name *,PyObject ** value *)- 通用属性设置器和删除器函数,旨在将其放入类型对象的tp_setattro插槽中。它在对象的 MRO 中的类的词典中查找数据 Descriptors,如果找到该 Descriptors,则优先于设置或删除实例词典中的属性。否则,将在对象的dict(如果存在)中设置或删除该属性。成功时,将返回
0
,否则将引发AttributeError并返回-1
。
- 通用属性设置器和删除器函数,旨在将其放入类型对象的tp_setattro插槽中。它在对象的 MRO 中的类的词典中查找数据 Descriptors,如果找到该 Descriptors,则优先于设置或删除实例词典中的属性。否则,将在对象的dict(如果存在)中设置或删除该属性。成功时,将返回
-
int
PyObject_DelAttr
(PyObject *o ,PyObject attr_name *)- 删除对象* o 的名为 attr_name *的属性。失败时返回
-1
。这等效于 Python 语句del o.attr_name
。
- 删除对象* o 的名为 attr_name *的属性。失败时返回
-
int
PyObject_DelAttrString
(PyObject *o ,const char attr_name *)- 删除对象* o 的名为 attr_name *的属性。失败时返回
-1
。这等效于 Python 语句del o.attr_name
。
- 删除对象* o 的名为 attr_name *的属性。失败时返回
-
PyObject *
PyObject_RichCompare
(PyObject *o1 ,PyObject o2 *,int * opid *)- 返回值:新参考.
使用* opid 指定的操作比较 o1 和 o2 的值,该操作必须是Py_LT
,Py_LE
,Py_EQ
,Py_NE
,Py_GT
或Py_GE
之一,与<
,<=
,==
,!=
,>
对应或>=
。这等效于 Python 表达式o1 op o2
,其中op
是与 opid 对应的运算符。如果成功,则返回比较的值;如果失败,则返回 NULL *。
- int
PyObject_RichCompareBool
(PyObject *o1 ,PyObject o2 *,int * opid *)- 使用* opid 指定的操作比较 o1 和 o2 的值,该操作必须是
Py_LT
,Py_LE
,Py_EQ
,Py_NE
,Py_GT
或Py_GE
之一,与<
,<=
,==
,!=
,>
对应或>=
。错误时返回-1
,如果结果为假,则返回0
,否则返回1
。这等效于 Python 表达式o1 op o2
,其中op
是与 opid *对应的运算符。
- 使用* opid 指定的操作比较 o1 和 o2 的值,该操作必须是
Note
如果* o1 和 o2 *是同Pair象,则PyObject_RichCompareBool()将始终为Py_EQ
返回1
,对于Py_NE
返回0
。
- int
PyObject_Cmp
(PyObject *o1 ,PyObject o2 *,int ** result *)- 使用* o1 提供的例程(如果存在)比较 o1 和 o2 的值,否则使用 o2 提供的例程进行比较。比较结果以 result *返回。失败时返回
-1
。这等效于 Python 语句result = cmp(o1, o2)
。
- 使用* o1 提供的例程(如果存在)比较 o1 和 o2 的值,否则使用 o2 提供的例程进行比较。比较结果以 result *返回。失败时返回
- 整数
PyObject_Compare
(PyObject *o1 ,PyObject o2 *)- 使用* o1 提供的例程(如果存在)比较 o1 和 o2 的值,否则使用 o2 *提供的例程进行比较。返回比较成功的结果。错误时,返回的值不确定。使用PyErr_Occurred()来检测错误。这等效于 Python 表达式
cmp(o1, o2)
。
- 使用* o1 提供的例程(如果存在)比较 o1 和 o2 的值,否则使用 o2 *提供的例程进行比较。返回比较成功的结果。错误时,返回的值不确定。使用PyErr_Occurred()来检测错误。这等效于 Python 表达式
计算对象* o 的字符串表示形式。如果成功,则返回字符串表示形式;如果失败,则返回 NULL *。这等效于 Python 表达式repr(o)
。由repr()内置函数和反引号调用。
计算对象* o 的字符串表示形式。如果成功,则返回字符串表示形式;如果失败,则返回 NULL *。这等效于 Python 表达式str(o)
。由str()内置函数和print语句调用。
- PyObject *
PyObject_Bytes
(PyObject ** o *)- 计算对象* 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 是类型对象而不是类对象,则如果 inst 是 cls 类型,则PyObject_IsInstance()返回1
。如果 cls 是一个 Tuples,将对 cls 中的每个条目进行检查。当至少一项检查返回1
时,结果将为1
,否则为0
。如果 inst 不是类实例,并且 cls 既不是类型对象,类对象也不是 Tuples,则 inst 必须具有class属性-该属性值与 cls *的类关系将用于确定此Function的结果。
- 如果* inst 是类 cls 或 cls 的子类的实例,则返回
2.1 版中的新Function。
在版本 2.2 中进行了更改:添加了第二个参数,支持 Tuples。
子类确定是pass一种相当直接的方式完成的,但它包括皱纹,扩展类的实现者可能希望意识到。如果A
和B
是类对象,则B
是A
的子类,如果它直接或间接地从A
继承。如果其中一个不是类对象,则使用更通用的机制来确定两个对象的类关系。测试* B 是否为 A 的子类时,如果 A 为 B ,则PyObject_IsSubclass()返回 true。如果 A 和 B 是不同的对象,则以深度优先的方式为 A 搜索 B *的bases属性-认为bases属性足以进行此确定。
- int
PyObject_IsSubclass
(PyObject 派生,PyObject* cls *)- 如果类* derived 与类 cls 相同或从类 cls 派生,则返回
1
,否则返回0
。发生错误时,返回-1
。如果 cls 是一个 Tuples,将对 cls 中的每个条目进行检查。当至少一项检查返回1
时结果为1
,否则为0
。如果 derived 或 cls *不是实际的类对象(或 Tuples),则此函数使用上述通用算法。
- 如果类* derived 与类 cls 相同或从类 cls 派生,则返回
2.1 版中的新Function。
在版本 2.3 中进行了更改:较旧的 Python 版本不支持将 Tuples 作为第二个参数。
-
int
PyCallable_Check
(PyObject ** o *)- 确定对象* o *是否可调用。如果对象可调用,则返回
1
,否则返回0
。此Function始终成功。
- 确定对象* o *是否可调用。如果对象可调用,则返回
-
PyObject *
PyObject_Call
(PyObject *callable_object ,PyObject args *,PyObject ** kw *)- 返回值:新参考.
调用可调用的 Python 对象* callable_object ,其参数由 Tuples args 给出,命名参数由字典 kw 给出。如果不需要命名参数,则 kw 可以为 NULL *。 * args 不能为 NULL ,如果不需要参数,请使用一个空的 Tuples。如果成功,则返回调用结果;如果失败,则返回 NULL *。这等效于 Python 表达式apply(callable_object, args, kw)
或callable_object(*args, **kw)
。
2.2 版中的新Function。
用 Tuples* args 给出的参数调用可调用的 Python 对象 callable_object 。如果不需要参数,则 args 可以为 NULL 。如果成功,则返回调用结果;如果失败,则返回 NULL *。这等效于 Python 表达式apply(callable_object, args)
或callable_object(*args)
。
使用可变数量的 C 参数调用可调用的 Python 对象* callable 。使用Py_BuildValue()样式格式字符串描述 C 参数。格式可以为 NULL ,表示未提供任何参数。如果成功,则返回调用结果;如果失败,则返回 NULL *。这等效于 Python 表达式apply(callable, args)
或callable(*args)
。请注意,如果仅传递PyObject * args,则PyObject_CallFunctionObjArgs()是更快的选择。
用可变数量的 C 参数调用对象* o 的名为 method 的方法。 C 参数由Py_BuildValue()格式的字符串描述,该字符串应产生一个 Tuples。格式可以为 NULL ,表示未提供任何参数。如果成功,则返回调用结果;如果失败,则返回 NULL *。这等效于 Python 表达式o.method(args)
。请注意,如果仅传递PyObject * args,则PyObject_CallMethodObjArgs()是更快的选择。
调用可变数量的PyObject*参数的可调用 Python 对象* callable 。提供的参数是可变数量的参数,后跟 NULL 。如果成功,则返回调用结果;如果失败,则返回 NULL *。
2.2 版中的新Function。
调用对象* o 的方法,该方法的名称在 name 中作为 Python 字符串对象给出。使用可变数量的PyObject*参数来调用它。提供的参数是可变数量的参数,后跟 NULL 。如果成功,则返回调用结果;如果失败,则返回 NULL *。
2.2 版中的新Function。
- 长
PyObject_Hash
(PyObject ** o *)- 计算并返回对象* o *的哈希值。失败时,返回
-1
。这等效于 Python 表达式hash(o)
。
- 计算并返回对象* o *的哈希值。失败时,返回
- 长
PyObject_HashNotImplemented
(PyObject ** o *)- 设置一个TypeError表示
type(o)
不可哈希,并返回-1
。当此函数存储在tp_hash
插槽中时,将得到特殊处理,从而允许类型向解释器明确指示其不可哈希。
- 设置一个TypeError表示
2.6 版的新Function。
-
int
PyObject_IsTrue
(PyObject ** o *)- 如果对象* o *被认为是 true,则返回
1
,否则返回0
。这等效于 Python 表达式not not o
。失败时,返回-1
。
- 如果对象* o *被认为是 true,则返回
-
int
PyObject_Not
(PyObject ** o *)- 如果对象* o *被认为是 true,则返回
0
,否则返回1
。这等效于 Python 表达式not o
。失败时,返回-1
。
- 如果对象* o *被认为是 true,则返回
-
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 是 type 类型或 type 的子类型,则返回 true。这两个参数都必须不是 NULL *。
2.2 版中的新Function。
- Py_ssize_t
PyObject_Length
(PyObject ** o *) - Py_ssize_t
PyObject_Size
(PyObject ** o *)- 返回对象的长度* o 。如果对象 o *提供序列和 Map 协议,则返回序列长度。错误时,返回
-1
。这等效于 Python 表达式len(o)
。
- 返回对象的长度* o 。如果对象 o *提供序列和 Map 协议,则返回序列长度。错误时,返回
在版本 2.5 中进行了更改:这些函数返回了int
类型。这可能需要更改您的代码以正确支持 64 位系统。
返回* o 的元素,失败时对应于对象 key 或 NULL *。这等效于 Python 表达式o[key]
。
-
int
PyObject_SetItem
(PyObject *o ,PyObject key *,PyObject ** v *)- 将对象* key Map 到值 v *。引发异常并在失败时返回
-1
;成功返回0
。这等效于 Python 语句o[key] = v
。
- 将对象* key Map 到值 v *。引发异常并在失败时返回
-
int
PyObject_DelItem
(PyObject *o ,PyObject key *)- 从* o 删除 key *的 Map。失败时返回
-1
。这等效于 Python 语句del o[key]
。
- 从* o 删除 key *的 Map。失败时返回
-
int
PyObject_AsFileDescriptor
(PyObject ** o *)- 从 Python 对象派生文件 Descriptors。如果对象是整数或长整数,则返回其值。如果不存在,则调用该对象的
fileno()
方法(如果存在);否则,将调用该对象的fileno()
方法。该方法必须返回一个整数或长整数,将其作为文件 Descriptors 值返回。失败时返回-1
。
- 从 Python 对象派生文件 Descriptors。如果对象是整数或长整数,则返回其值。如果不存在,则调用该对象的
-
PyObject *
PyObject_Dir
(PyObject ** o *)- 返回值:新参考.
这等效于 Python 表达式dir(o)
,返回适合于对象参数的字符串列表(可能为空),如果有错误,则返回* NULL 。如果参数为 NULL ,则类似于 Python dir()
,返回当前本地名称。在这种情况下,如果没有执行框架处于活动状态,则返回 NULL *,但是PyErr_Occurred()将返回 false。
这等效于 Python 表达式iter(o)
。它为对象参数返回一个新的迭代器,如果对象已经是一个迭代器,则返回对象本身。如果不能迭代该对象,则引发TypeError并返回* NULL *。