在Python和C

时间:2016-10-29 04:17:19

标签: python python-3.5 python-c-api python-c-extension

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

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

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

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子类的最佳方法是什么?

2 个答案:

答案 0 :(得分:0)

就个人而言,我不会尝试在C中尝试使用面向对象的东西。我会坚持编写一个暴露某些(无状态)函数的模块。

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

答案 1 :(得分:0)

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

from mymodule._mymodule import _Matrix;

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