在C中创建Python扩展类型的实例

1 投票
1 回答
1492 浏览
提问于 2025-04-15 21:12

我正在写一个简单的 Vector 实现,这是一个用 C 语言编写的 Python 扩展模块,基本上长这样:

typedef struct {
    PyObject_HEAD
    double x;
    double y;
} Vector;

static PyTypeObject Vector_Type = {
    ...
};

在 Python 中创建 Vector 的实例非常简单,但我需要在同一个扩展模块中创建一个 Vector 实例。我查阅了文档,但没有找到明确的答案。有什么好的方法可以做到这一点吗?

1 个回答

3

最简单的方法就是调用你创建的类型对象,比如使用 PyObject_CallFunction。别被这个名字迷惑了,它其实可以让你调用 任何 可调用的东西,不仅仅是函数。

如果你没有方便地将你的类型对象作为一个 static 全局变量放在你的 C 模块里,你当然可以通过各种方式来获取它(比如通过你的模块对象使用 PyObject_GetAttrString)。不过,把这个 PyObject* 放到一个 static 模块级的 C 变量里,可能是最简单和最方便的做法。

撰写回答