在 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!"
我目前正在学习如何使用 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!"