通用对象结构

在 Python 的对象类型的定义中使用了大量的结构。本节介绍这些结构及其使用方法。

在内存中该对象表示的开头,所有 Python 对象finally都共享少量字段。这些由PyObjectPyVarObject类型表示,它们依次由在所有其他 Python 对象的定义中直接或间接使用的某些宏的扩展定义。

PyObject ob_base;

请参阅上面的PyObject文档。

PyVarObject ob_base;

请参阅上面的PyVarObject文档。

(((PyObject*)(o))->ob_type)
(((PyObject*)(o))->ob_refcnt)
(((PyVarObject*)(o))->ob_size)
_PyObject_EXTRA_INIT
1, type,
_PyObject_EXTRA_INIT
1, type, size,
Field C Type Meaning
ml_name const char * 方法名称
ml_meth PyCFunction 指向 C 实现的指针
ml_flags int 标志位指示如何构造呼叫
ml_doc const char * 指向文档字符串的内容

ml_meth是 C 函数指针。这些函数可能具有不同的类型,但它们始终返回PyObject*。如果该函数不是PyCFunction,则编译器将需要在方法表中进行强制转换。即使PyCFunction将第一个参数定义为PyObject*,方法实现通常也使用* self *对象的特定 C 类型。

ml_flags字段是一个位字段,可以包含以下标志。各个标志指示调用约定或绑定约定。

位置参数有四个基本的调用约定,其中两个可以与METH_KEYWORDS组合以也支持关键字参数。因此,共有 6 个调用约定:

这不是limited API的一部分。

3.7 版中的新Function。

这不是limited API的一部分。

3.7 版中的新Function。

这两个常量不用于表示调用约定,而是用于类方法时的绑定。这些可能不适用于为模块定义的Function。对于任何给定的方法,最多只能设置这些标志之一。

另一个常量控制是否加载一个方法来代替具有相同方法名称的另一个定义。

Field C Type Meaning
name const char * 会员名称
type int C 结构中成员的类型
offset Py_ssize_t 成员位于类型的对象 struct 上的偏移量(以字节为单位)
flags int 标志位,指示该字段是只读还是可写
doc const char * 指向文档字符串的内容

type可以是与各种 C 类型相对应的T_宏之一。在 Python 中访问该成员时,该成员将转换为等效的 Python 类型。

Macro name C type
T_SHORT short
T_INT int
T_LONG long
T_FLOAT float
T_DOUBLE double
T_STRING const char *
T_OBJECT PyObject *
T_OBJECT_EX PyObject *
T_CHAR char
T_BYTE char
T_UBYTE unsigned char
T_UINT unsigned int
T_USHORT unsigned short
T_ULONG unsigned long
T_BOOL char
T_LONGLONG long long
T_ULONGLONG 无符号长久
T_PYSSIZET Py_ssize_t

T_OBJECTT_OBJECT_EX的不同之处在于,如果成员为NULL并且T_OBJECT_EX引发AttributeError,则T_OBJECT返回None。try使用T_OBJECT_EX而不是T_OBJECT,因为T_OBJECT_EX处理该属性上的del语句比使用T_OBJECT更正确。

flags可以是0(用于读写访问)或READONLY(用于只读访问)。为type使用T_STRING意味着READONLYT_STRING数据被解释为 UTF-8.只能删除T_OBJECTT_OBJECT_EX成员。 (它们设置为NULL)。

Field C Type Meaning
name const char * attribute name
get getter C 函数获取属性
set setter 可选的 C 函数,用于设置或删除属性,如果Ellipsis,则该属性为只读
doc const char * optional docstring
closure void * 可选的函数指针,为 getter 和 setter 提供附加数据

get函数采用一个PyObject*参数(实例)和一个函数指针(关联的closure):

typedef PyObject *(*getter)(PyObject *, void *);

如果成功,则应返回新的引用,如果失败,则应返回NULL,并返回设置的异常。

set函数采用两个PyObject*参数(实例和要设置的值)和一个函数指针(关联的closure):

typedef int (*setter)(PyObject *, PyObject *, void *);

万一该属性应被删除,第二个参数是NULL。成功应返回0或失败应返回-1

首页