【问题标题】:In C++/Cython it possible to only declare relevant attributes to be visible in Python?在 C++/Cython 中,是否可以只声明相关属性在 Python 中可见?
【发布时间】:2019-11-13 17:03:08
【问题描述】:

假设我有一个包含以下代码的 .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 代码中调用它们。

这是一种可能导致问题/奇怪行为的不良做法吗? 如果有,为什么?

【问题讨论】:

    标签: python c++ cython


    【解决方案1】:
    cdef class PyClass:
        cdef MyClass *classptr
        # ...
        cdef int Attribute1;
    

    Attribute1 不会按照你的想法去做。它是作为PyClass 的一部分存储的单独值,与classptr 中的Attribute1 无关。你可能想写一个属性。


    但是,回答您的问题:

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

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

    • 复杂的继承层次结构:如果您关心的函数实际上来自基类,则无关紧要。只需包装您正在使用的派生类。

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

    除了不能调用你没有从 python 包装的代码之外,真的没有任何后果。 Cython 的 C++ 支持(并且很可能总是)有些不完整,通常需要为其提供简化的 C++ 接口才能完成任何工作。

    【讨论】:

    • 哇,这会省去我很多麻烦!谢谢!
    猜你喜欢
    • 1970-01-01
    • 2014-12-05
    • 1970-01-01
    • 2023-03-25
    • 2011-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多