【发布时间】:2021-02-10 05:59:29
【问题描述】:
我编写了一个C 代码用于与 Raspberry Pi 进行芯片通信,其中包括几个公共功能。
为了将其包装在Python 中使用,我将代码编译成so 文件并使用ctypes,因为对我来说这是最简单的方法。
但是,这种方法有两个缺陷:
- Python 代码有时比较古怪。例如,如果函数接受一个数组作为参数,那么 Python 中的编码如下所示:
MCP4728 = cdll.LoadLibrary("./MCP4728.so") multipleexternal = MCP4728.multipleexternal multipleexternal.restype = c_int multipleexternal.argtypes = [POINTER(c_float), c_bool] voltages=[0.5,1.5,2.5,2.5] floats = (c_float*4)(*voltages) multipleinternal(floats,False)
-
我不知道如何将其转换为面向对象编程,所以一个可以同时连接两个不同的芯片。
-
最后,我想将我的软件公开并发布到
github。在这种情况下,可能会首选其他一些包装方法。
我知道还有许多其他方法可以为Python 包装C 代码,如here 所述。您能给我建议使用哪种方法,甚至是最合适的面向对象编程示例吗?
感谢您的帮助!
编辑:
这不仅仅是语法的问题,也是概念的问题。 C 库中的函数可用于所有芯片,但每个芯片都需要在库中保存一组不同的变量。
那我该怎么办?在 Python 中定义类,其中创建新对象意味着在连接到该对象的库中创建新的struct?或者也许为每个对象使用C 库的新实例?或者也许在C 库中创建类/对象?我完全一无所知。
【问题讨论】:
-
让我们专注于您的同时使用两个不同的芯片问题。是什么特别阻止你这样做?请注意,C 支持 struct 对象,因此除非您需要继承之类的东西(这不太可能)...
-
@robertharvey 哦,我不知道。我认为C没有OOP支持。也许我应该查一下,因为我从来没有在 C 上做过 OOP。
-
有一些方法可以在 C 中支持成熟的 OOP,但我猜你不会需要它。
-
C 中的 OOP 非常简单,但在编码时必须保持纪律。基本上,您为每个函数调用提供对其数据类型存储对象的引用。当您声明使用“self”的函数时,您也可以从 Python 中了解到这种编码模式。 OOP 是一种编码模式,而不是一种特性。
-
重点是,您认为您需要 OOP,但您可能不需要。您可能需要为每个芯片维护单独的状态。