繁体   English   中英

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

[英]In C++/Cython it possible to only declare relevant attributes to be visible in Python?

假设我有带有以下代码的 ah 文件:

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

还有一个related.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 创建 a.so 库以导入 python 模块。

请注意,尽管 c++ 中存在 MyClass::Method2 和 MyClass::Attribute2,但我在 Cython 中没有提及它们,因此它们在 .so 库中不可见。 也许我这样做是因为它们被 MyClass::Method1() 间接使用,或者只是因为我不打算在 python 代码中调用它们。

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

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

Attribute1不会像你想的那样做。 它是作为 PyClass 的一部分存储的单独值,与PyClass中的Attribute1 classptr 您可能想改写一个属性。


但是,要回答您的问题:

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM