在 Python 和 C 中定义 Python class

Defining a Python class in both Python and C

我目前正在学习如何使用 Python C API 编写 Python (v3.5) 扩展模块。有些操作,比如快速数值运算,最好用 C 来完成,而其他操作,比如字符串操作,在 Python 中更容易实现。是否有一致同意的方法来使用 Python 和 C 代码来定义新类型?

例如,我用 C 写了一个支持基本存储和算术运算的 Matrix 类型。我想使用 Python 定义 Matrix.__str__,其中字符串操作要容易得多,我不需要担心 cstrings。

我试图在 __init__.py 中加载模块时定义 __str__ 方法,如下所示:

from mymodule._mymodule import Matrix;

def as_str(self):
    print("This is a matrix!");

Matrix.__str__ = as_str;

当我运行这个代码时,我得到一个TypeError: can't set attributes of built-in/extension type 'matey.Matrix'。有没有可接受的方法来做到这一点?如果解决方案是对 Matrix 进行子类化,那么在模块中组织 C 基础 类 / Python sub类 的最佳方法是什么?

就个人而言,我不会尝试在 C 中做面向对象的事情。我会坚持编写一个公开一些(无状态)函数的模块。

如果我希望 Python 接口是面向对象的,我会在 Python 中编写一个 class,它导入那个(C 扩展)模块并使用它的函数。任何状态的维护都将在 Python 中完成。

您可以改为定义 _Matrix 类型,然后使用传统的 OOP 方法对其进行扩展

from mymodule._mymodule import _Matrix;

class Matrix(_Matrix):
    def __str__(self):
        return "This is a matrix!"