通用对象结构

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

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

这些宏用于PyObjectPyVarObject的定义:

Py_ssize_t ob_refcnt;
PyTypeObject *ob_type;

定义Py_TRACE_REFS后,它将扩展为:

PyObject *_ob_next, *_ob_prev;
Py_ssize_t ob_refcnt;
PyTypeObject *ob_type;
PyObject_HEAD
Py_ssize_t ob_size;

请注意,PyObject_HEAD是扩展的一部分,其自身的扩展取决于Py_TRACE_REFS的定义而有所不同。

(((PyObject*)(o))->ob_type)

2.6 版的新Function。

(((PyObject*)(o))->ob_refcnt)

2.6 版的新Function。

(((PyVarObject*)(o))->ob_size)

2.6 版的新Function。

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

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

ml_flags字段是一个位字段,可以包含以下标志。各个标志指示调用约定或绑定约定。在调用约定标志中,只能组合METH_VARARGSMETH_KEYWORDS。任何调用约定标志都可以与绑定标志结合使用。

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

2.3 版的新Function。

2.3 版的新Function。

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

2.4 版的新Function。

Field C Type Meaning
name char * 会员名称
type int C 结构中成员的类型
offset Py_ssize_t 成员位于类型的对象 struct 上的偏移量(以字节为单位)
flags int 标志位,指示该字段是只读还是可写
doc 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 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意味着READONLY。只能删除T_OBJECTT_OBJECT_EX成员。 (它们设置为* NULL *)。

Field C Type Meaning
name char * attribute name
get getter C 函数获取属性
set setter 可选的 C 函数,用于设置或删除属性,如果Ellipsis,则该属性为只读
doc 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

返回用 C 实现的扩展类型的绑定方法对象。这在不使用PyObject_GenericGetAttr()函数的tp_getattrotp_getattr处理程序的实现中很有用。

首页