在C++/Cython中,是否可以只声明相关属性在Python中可见?

2024-09-24 00:35:17 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一个带有以下代码的.h文件:

class MyClass
{
    public:
        int Attribute1;
        int Attribute2;
        MyClass(){};
        virtual ~MyClass(){};
        virtual void Method1(string var1);
        virtual float Method2(float var2);
};

以及一个相关的.pyx文件,其中包含:

cdef class PyClass:
    cdef MyClass *classptr
        [standard __cinit__ and __dealloc__ declarations ]
        cdef int Attribute1;
        def Method1(self, var1):
            self.classptr.Method1(var1)

。。。和pxd文件,其中包含:

cdef extern from "mycode.h":
    cdef cppclass MyClass:
        MyClass() except +
        int Attribute1
        void Method1(string)

我使用setup.py创建一个.so库以导入python模块

注意,即使MyClass::Mult2和MyClass:属性存在于C++中,我在Cython中没有提到它们,所以它们将不会在.so库中可见。我这样做可能是因为MyClass::Method1()间接使用了它们,或者只是因为我不打算在python代码中调用它们

这是一种可能导致问题/怪异行为的不良做法吗? 若然,原因为何


Tags: 文件代码selfstringvirtualmyclassfloatclass
1条回答
网友
1楼 · 发布于 2024-09-24 00:35:17
cdef class PyClass:
    cdef MyClass *classptr
    # ...
    cdef int Attribute1;

Attribute1不会做你想做的事。它是作为PyClass的一部分存储的单独值,与classptr中的Attribute1无关。您可能需要编写一个属性


但是,要回答您的问题:

是的,您可以只包装您感兴趣的特定函数。Cython不需要知道C++类的所有细节——只需要知道足够的细节,就可以使用它们生成有效的C++代码。省略一些有用的快速示例:

  • 模板。例如std::string实际上是一个模板typedef,但Cython包装器可能不一定知道这一点,或者可选的分配器模板类型,或者Cython不真正支持的数字模板类型

  • 复杂的继承层次结构:不管您关心的函数是否来自基类。只需包装您正在使用的派生类

  • 返回其他类的接口-因为这样您就需要包装第二个类(可能会公开第三个类…)

除了不能调用尚未从python包装的代码之外,没有其他后果。Cython的C++支持(并且可能总是)有点不完整,通常需要给它一个简化的C++接口来完成任何事情。p>

相关问题 更多 >