在C ++ / Cython中,可能仅声明相关属性才能在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 :: Method2和MyClass :: Attribute2在c ++中存在,在Cython中也没有提及它们,因此它们在.so库中不可见。也许是因为MyClass :: Method1()间接使用了它们,或者只是因为我不打算在python代码中调用它们。

这是不好的做法,很可能会引起问题/奇怪的行为吗? 如果是这样,为什么?

tangshuo4444 回答:在C ++ / Cython中,可能仅声明相关属性才能在Python中可见?

cdef class PyClass:
    cdef MyClass *classptr
    # ...
    cdef int Attribute1;

Attribute1并没有您的想法。它是作为PyClass的一部分存储的单独值,与Attribute1中的classptr没有关系。您可能想写一个属性。


但是,要回答您的问题:

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

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

  • 复杂的继承层次结构:您关心的功能是否实际上来自基类并不重要。只需包装您正在使用的派生类即可。

  • 返回其他类的接口-因为这时您需要包装第二个类(这可能会暴露第三个类...)。

除了无法调用您未从python包装的代码外,实际上没有任何其他后果。 Cython对C ++的支持(并且可能永远都是)有些不完整,通常有必要为其提供简化的C ++接口以完成所有工作。

本文链接:https://www.f2er.com/3108145.html

大家都在问