MyClass
创建一个 Python docs.python.org 定义 。一个堆类型对应于一个 Python 类,然后将它赋值给MyModule
模块 。
注意,如果其中一个函数返回失败,则必须减少以前创建的复制对象的引用计数,以便解释器删除它们 。
指定 Python 类型
MyClass
详述在 github.com 中可以找到,它作为 docs.python.org 的一个实例:
-
static PyType_Spec spec_myclass = {
-
"MyClass", // name
-
sizeof(MyClassObject) + sizeof(MyClass), // basicsize
-
0, // itemsize
-
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, // flags
-
MyClass_slots // slots
-
};
它定义了一些基本类型信息,它的大小包括 Python 表示的大小(
MyClassObject
)和普通 C++ 类的大小(MyClass
) 。MyClassObject
定义如下:-
typedef struct {
-
PyObject_HEAD
-
int m_value;
-
MyClass* m_myclass;
-
} MyClassObject;
Python 表示的话就是 docs.python.org 类型,由
PyObject_HEAD
宏和其他一些成员定义 。成员m_value
视为普通类成员,而成员m_myclass
只能在 C++ 代码内部访问 。docs.python.org 定义了一些其他功能:
-
static PyType_Slot MyClass_slots[] = {
-
{Py_tp_new, (void*)MyClass_new},
-
{Py_tp_init, (void*)MyClass_init},
-
{Py_tp_dealloc, (void*)MyClass_Dealloc},
-
{Py_tp_members, MyClass_members},
-
{Py_tp_methods, MyClass_methods},
-
{0, 0} /* Sentinel */
-
};
在这里,设置了一些初始化和析构函数的跳转,还有普通的类方法和成员,还可以设置其他功能,如分配初始属性字典,但这是可选的 。这些定义通常以一个哨兵结束,包含
NULL
值 。要完成类型详述,还包括下面的方法和成员表:
-
static PyMethodDef MyClass_methods[] = {
-
{"addOne", (PyCFunction)MyClass_addOne, METH_NOARGS, PyDoc_STR("Return an incrmented integer")},
-
{NULL, NULL} /* Sentinel */
-
};
-
-
static struct PyMemberDef MyClass_members[] = {
-
{"value", T_INT, offsetof(MyClassObject, m_value)},
-
{NULL} /* Sentinel */
-
};
在方法表中,定义了 Python 方法
addOne
,它指向相关的 C++ 函数MyClass_addOne
。它充当了一个包装器,它在 C++ 类中调用addOne()
方法 。在成员表中,只有一个为演示目的而定义的成员 。不幸的是,在 docs.python.org 中使用的 en.cppreference.com 不允许添加 C++ 类型到
MyClassObject
。如果你试图放置一些 C++ 类型的容器(如 en.cppreference.com),编译器会抱怨一些内存布局相关的警告 。初始化和析构
MyClass_new
方法只为MyClassObject
提供一些初始值,并为其类型分配内存:
推荐阅读
- Python 教你快速批量下载抖音去水印短视频
- 为什么我抓不到baidu的数据包?
- Python破解24点游戏
- 为什么Java线程没有Running状态?
- 一次服务器沦陷为肉鸡后的排查过程
- 国外大学生用AI写论文,还次次拿到A
- 为什么短短两周之后就鲜有人继续讨论ChatGPT了?
- 开发一个简单的热搜微信小程序
- 戚薇|戚薇二胎产后首露面,发长文卖惨为月子中心打广告,网友:快封杀
- 为什么有些腕表被称为医生表?